diff --git a/docs/source/model.rst b/docs/source/model.rst index 19dcaad50..1960a42c4 100644 --- a/docs/source/model.rst +++ b/docs/source/model.rst @@ -163,20 +163,3 @@ will not be overwritten by templates applied later. statuses For CQ queries, read https://github.com/npgall/cqengine#string-based-queries-sql-and-cqn-dialects. - -Service state (alpha) ---------------------- - -You can also add state providers which are used to gather live data and thereby provide state for the items. Currently only prometheus is supported. - -.. code-block:: yaml - :linenos: - - identifier: nivio:example - name: Landscape example - - ... - - stateProviders: - - type: prometheus-exporter - target: http://prometheus_exporter.url \ No newline at end of file diff --git a/src/main/java/de/bonndan/nivio/api/ApiController.java b/src/main/java/de/bonndan/nivio/api/ApiController.java index 877c86bcd..bc25f12da 100644 --- a/src/main/java/de/bonndan/nivio/api/ApiController.java +++ b/src/main/java/de/bonndan/nivio/api/ApiController.java @@ -124,7 +124,7 @@ public ProcessLog deleteService( if (from == null) return new ProcessLog(new ProcessingException(landscape, "Could use fully qualified identifier " + fqi)); - Optional item = ServiceItems.find(FullyQualifiedIdentifier.build(from.getLandscape(), from.getGroup(), from.getIdentifier()), landscape.getItems()); + Optional item = Items.find(FullyQualifiedIdentifier.build(from.getLandscape(), from.getGroup(), from.getIdentifier()), landscape.getItems()); if (!item.isPresent()) { return new ProcessLog(new ProcessingException(landscape, "Could find item " + fqi)); } diff --git a/src/main/java/de/bonndan/nivio/api/LandscapeDTOFactory.java b/src/main/java/de/bonndan/nivio/api/LandscapeDTOFactory.java index 154077a40..a4fd30890 100644 --- a/src/main/java/de/bonndan/nivio/api/LandscapeDTOFactory.java +++ b/src/main/java/de/bonndan/nivio/api/LandscapeDTOFactory.java @@ -23,7 +23,6 @@ public static LandscapeDTO from(Landscape item) { l.identifier = item.getIdentifier(); l.name = item.getName(); l.contact = item.getContact(); - l.stateProviders = item.getStateProviders(); l.source = item.getSource(); return l; diff --git a/src/main/java/de/bonndan/nivio/api/dto/LandscapeDTO.java b/src/main/java/de/bonndan/nivio/api/dto/LandscapeDTO.java index 5e5fd300d..dcdd2e08b 100644 --- a/src/main/java/de/bonndan/nivio/api/dto/LandscapeDTO.java +++ b/src/main/java/de/bonndan/nivio/api/dto/LandscapeDTO.java @@ -3,7 +3,6 @@ import de.bonndan.nivio.model.GroupItem; import de.bonndan.nivio.model.LandscapeConfig; import de.bonndan.nivio.model.Landscape; -import de.bonndan.nivio.model.StateProviderConfig; import org.springframework.hateoas.ResourceSupport; import java.util.List; @@ -17,7 +16,6 @@ public class LandscapeDTO extends ResourceSupport implements Landscape { public String identifier; public String name; public String contact; - public List stateProviders; public String source; @Override @@ -40,11 +38,6 @@ public String getSource() { return source; } - @Override - public List getStateProviders() { - return stateProviders; - } - @Override public LandscapeConfig getConfig() { return null; diff --git a/src/main/java/de/bonndan/nivio/input/Indexer.java b/src/main/java/de/bonndan/nivio/input/Indexer.java index 54f962ff2..128f02b73 100644 --- a/src/main/java/de/bonndan/nivio/input/Indexer.java +++ b/src/main/java/de/bonndan/nivio/input/Indexer.java @@ -99,7 +99,7 @@ private void diff(final LandscapeDescription input, final LandscapeImpl landscap kept.forEach( item -> { - ItemDescription description = (ItemDescription) ServiceItems.find(item.getFullyQualifiedIdentifier(), input.getItemDescriptions()).orElse(null); + ItemDescription description = (ItemDescription) Items.find(item.getFullyQualifiedIdentifier(), input.getItemDescriptions()).orElse(null); if (description == null) { if (input.isPartial()) { inLandscape.add((Item) item); @@ -132,7 +132,7 @@ private void fillGroups(LandscapeDescription input, LandscapeImpl landscape) { GroupDescription description = (GroupDescription) groupItem; Group group = (Group) landscape.getGroups().get(description.getIdentifier()); description.getContains().forEach(condition -> { - group.getItems().addAll(ServiceItems.filter(condition, List.copyOf(landscape.getItems()))); + group.getItems().addAll(Items.filter(condition, List.copyOf(landscape.getItems()))); }); }); } @@ -163,7 +163,7 @@ private void linkAllProviders(Set items, LandscapeDescription landscapeDes items.forEach( service -> { ItemDescription description = - (ItemDescription) ServiceItems.find(service.getFullyQualifiedIdentifier(), landscapeDescription.getItemDescriptions()).orElse(null); + (ItemDescription) Items.find(service.getFullyQualifiedIdentifier(), landscapeDescription.getItemDescriptions()).orElse(null); if (description == null) { if (isPartial) return; @@ -179,7 +179,7 @@ private void linkAllProviders(Set items, LandscapeDescription landscapeDes Item provider; try { var fqi = FullyQualifiedIdentifier.from(providerName); - provider = (Item) ServiceItems.find(fqi, items).orElse(null); + provider = (Item) Items.find(fqi, items).orElse(null); if (provider == null) { logger.warn("Could not find service " + fqi + " in landscape " + landscapeDescription + " while linking providers for service " + description.getFullyQualifiedIdentifier()); return; @@ -202,7 +202,7 @@ private void linkAllProviders(Set items, LandscapeDescription landscapeDes private void linkDataflow(final LandscapeDescription input, final LandscapeImpl landscape, ProcessLog logger) { input.getItemDescriptions().forEach(serviceDescription -> { - Item origin = (Item) ServiceItems.pick(serviceDescription, landscape.getItems()); + Item origin = (Item) Items.pick(serviceDescription, landscape.getItems()); if (!input.isPartial() && origin.getDataFlow().size() > 0) { logger.info("Clearing dataflow of " + origin); origin.getDataFlow().clear(); //delete all dataflow on full update @@ -211,7 +211,7 @@ private void linkDataflow(final LandscapeDescription input, final LandscapeImpl serviceDescription.getDataFlow().forEach(description -> { var fqi = FullyQualifiedIdentifier.from(description.getTarget()); - Item target = (Item) ServiceItems.find(fqi, landscape.getItems()).orElse(null); + Item target = (Item) Items.find(fqi, landscape.getItems()).orElse(null); if (target == null) { logger.warn("Dataflow target service " + description.getTarget() + " not found"); return; diff --git a/src/main/java/de/bonndan/nivio/input/ItemDescriptionFormatFactory.java b/src/main/java/de/bonndan/nivio/input/ItemDescriptionFormatFactory.java index f9d818894..4a520b14c 100644 --- a/src/main/java/de/bonndan/nivio/input/ItemDescriptionFormatFactory.java +++ b/src/main/java/de/bonndan/nivio/input/ItemDescriptionFormatFactory.java @@ -6,6 +6,7 @@ import de.bonndan.nivio.input.http.HttpService; import de.bonndan.nivio.input.kubernetes.ItemDescriptionFactoryKubernetes; import de.bonndan.nivio.input.nivio.ItemDescriptionFactoryNivio; +import de.bonndan.nivio.input.rancher1.ItemDescriptionFactoryRancher1; import de.bonndan.nivio.util.URLHelper; import java.net.URL; @@ -28,11 +29,14 @@ public static ItemDescriptionFactory getFactory(SourceReference reference, Lands if (reference == null || reference.getFormat() == null) return new ItemDescriptionFactoryNivio(fetcher, baseUrl); + //TODO use SourceFormat.from or similar switch (reference.getFormat()) { case DOCKER_COMPOSE2: return new ItemDescriptionFactoryCompose2(new FileFetcher(new HttpService()), baseUrl); case KUBERNETES: return new ItemDescriptionFactoryKubernetes(reference); + case RANCHER1_PROMETHEUS: + return new ItemDescriptionFactoryRancher1(baseUrl); } return new ItemDescriptionFactoryNivio(fetcher, baseUrl); diff --git a/src/main/java/de/bonndan/nivio/input/SourceReferencesResolver.java b/src/main/java/de/bonndan/nivio/input/SourceReferencesResolver.java index bcd973afc..6cacc3f9e 100644 --- a/src/main/java/de/bonndan/nivio/input/SourceReferencesResolver.java +++ b/src/main/java/de/bonndan/nivio/input/SourceReferencesResolver.java @@ -5,12 +5,12 @@ import de.bonndan.nivio.input.dto.LandscapeDescription; import de.bonndan.nivio.input.dto.ItemDescription; import de.bonndan.nivio.model.LandscapeItem; -import de.bonndan.nivio.model.ServiceItems; +import de.bonndan.nivio.model.Items; import java.util.ArrayList; import java.util.List; -import static de.bonndan.nivio.model.ServiceItems.find; +import static de.bonndan.nivio.model.Items.find; public class SourceReferencesResolver { @@ -31,7 +31,7 @@ public void resolve(final LandscapeDescription env, final ProcessLog log) { } value.forEach(identifier -> { - ServiceItems.filter(identifier, descriptions) + Items.filter(identifier, descriptions) .forEach(item -> ItemDescriptionFactory.assignTemplateValues((ItemDescription) item, (ItemDescription) template)); }); @@ -57,12 +57,12 @@ private void resolveTemplateQueries(final List itemDescriptions List providedBy = description.getProvidedBy(); description.setProvidedBy(new ArrayList<>()); providedBy.forEach(condition -> { - ServiceItems.filter(condition, itemDescriptions) + Items.filter(condition, itemDescriptions) .forEach(result -> description.getProvidedBy().add(result.getIdentifier())); }); description.getDataFlow().forEach(dataFlowItem -> { - ServiceItems.filter(dataFlowItem.getTarget(), itemDescriptions).stream() + Items.filter(dataFlowItem.getTarget(), itemDescriptions).stream() .findFirst() .ifPresent(service -> ((DataFlowDescription)dataFlowItem).setTarget(service.getFullyQualifiedIdentifier().toString())); }); diff --git a/src/main/java/de/bonndan/nivio/input/dto/ItemDescription.java b/src/main/java/de/bonndan/nivio/input/dto/ItemDescription.java index 5f18ea7c8..a5b6e29cb 100644 --- a/src/main/java/de/bonndan/nivio/input/dto/ItemDescription.java +++ b/src/main/java/de/bonndan/nivio/input/dto/ItemDescription.java @@ -73,6 +73,11 @@ public ItemDescription(String identifier) { this.identifier = identifier; } + public ItemDescription(FullyQualifiedIdentifier fqi) { + this.identifier = fqi.getIdentifier(); + this.group = fqi.getGroup(); + } + public String getIdentifier() { return identifier; } diff --git a/src/main/java/de/bonndan/nivio/input/dto/LandscapeDescription.java b/src/main/java/de/bonndan/nivio/input/dto/LandscapeDescription.java index e467e154d..536dd33f2 100644 --- a/src/main/java/de/bonndan/nivio/input/dto/LandscapeDescription.java +++ b/src/main/java/de/bonndan/nivio/input/dto/LandscapeDescription.java @@ -55,8 +55,6 @@ public class LandscapeDescription implements Landscape { */ private List itemDescriptions = new ArrayList<>(); - private List stateProviders; - private LandscapeConfig config; private boolean isPartial = false; @@ -94,15 +92,6 @@ public String getContact() { return contact; } - @Override - public List getStateProviders() { - return stateProviders; - } - - public void setStateProviders(List stateProviders) { - this.stateProviders = stateProviders; - } - public List getSourceReferences() { return sources; } @@ -141,7 +130,6 @@ public LandscapeImpl toLandscape() { landscape.setName(name); landscape.setContact(contact); landscape.setSource(source); - landscape.setStateProviders(stateProviders); landscape.setConfig(config); return landscape; } @@ -154,7 +142,7 @@ public void addItems(List incoming) { desc.setEnvironment(this.identifier); ItemDescription existing = (ItemDescription) - ServiceItems.find(desc.getIdentifier(), desc.getGroup(), itemDescriptions).orElse(null); + Items.find(desc.getIdentifier(), desc.getGroup(), itemDescriptions).orElse(null); if (existing != null) { ItemDescriptionFactory.assignNotNull(existing, desc); } else { diff --git a/src/main/java/de/bonndan/nivio/input/dto/SourceFormat.java b/src/main/java/de/bonndan/nivio/input/dto/SourceFormat.java index cebec978c..d1591bec2 100644 --- a/src/main/java/de/bonndan/nivio/input/dto/SourceFormat.java +++ b/src/main/java/de/bonndan/nivio/input/dto/SourceFormat.java @@ -8,12 +8,20 @@ public enum SourceFormat { + //TODO move to package, use annotations or service loader DOCKER_COMPOSE2("docker-compose-v2"), KUBERNETES("kubernetes", "k8s"), - NIVIO("nivio", ""); + NIVIO("nivio", ""), + RANCHER1_PROMETHEUS("rancher1-prometheus"); private final List formats; + private static final List KNOWN_FORMATS; + + static { + KNOWN_FORMATS = Arrays.asList(NIVIO, DOCKER_COMPOSE2, KUBERNETES, RANCHER1_PROMETHEUS); + } + SourceFormat(String format, String... formats) { this.formats = new ArrayList<>(); @@ -30,18 +38,9 @@ public static SourceFormat from(String format) { return NIVIO; format = format.toLowerCase(); - if (DOCKER_COMPOSE2.formats.contains(format)) { - return DOCKER_COMPOSE2; - } - - if (NIVIO.formats.contains(format)) { - return NIVIO; - } - - if (KUBERNETES.formats.contains(format)) { - return KUBERNETES; - } - - return NIVIO; + String finalFormat = format; + return KNOWN_FORMATS.stream() + .filter(sourceFormat -> sourceFormat.formats.contains(finalFormat)) + .findFirst().orElse(NIVIO); } } diff --git a/src/main/java/de/bonndan/nivio/input/kubernetes/ItemDescriptionFactoryKubernetes.java b/src/main/java/de/bonndan/nivio/input/kubernetes/ItemDescriptionFactoryKubernetes.java index 50dc91efa..5eece5f2c 100644 --- a/src/main/java/de/bonndan/nivio/input/kubernetes/ItemDescriptionFactoryKubernetes.java +++ b/src/main/java/de/bonndan/nivio/input/kubernetes/ItemDescriptionFactoryKubernetes.java @@ -4,7 +4,7 @@ import de.bonndan.nivio.input.dto.ItemDescription; import de.bonndan.nivio.input.dto.SourceReference; import de.bonndan.nivio.model.LandscapeItem; -import de.bonndan.nivio.model.ServiceItems; +import de.bonndan.nivio.model.Items; import de.bonndan.nivio.util.URLHelper; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Pod; @@ -87,7 +87,7 @@ private Collection createDescriptionFromService(Servi if (selector != null) targetId = selector.getOrDefault("app", null); if (!StringUtils.isEmpty(targetId)) { - ServiceItems.find(targetId, group, items).ifPresent(provider -> { + Items.find(targetId, group, items).ifPresent(provider -> { ((ItemDescription) provider).getProvidedBy().add(description.getIdentifier()); }); } diff --git a/src/main/java/de/bonndan/nivio/input/rancher1/ItemDescriptionFactoryRancher1.java b/src/main/java/de/bonndan/nivio/input/rancher1/ItemDescriptionFactoryRancher1.java new file mode 100644 index 000000000..697344317 --- /dev/null +++ b/src/main/java/de/bonndan/nivio/input/rancher1/ItemDescriptionFactoryRancher1.java @@ -0,0 +1,39 @@ +package de.bonndan.nivio.input.rancher1; + +import de.bonndan.nivio.input.ItemDescriptionFactory; +import de.bonndan.nivio.input.dto.ItemDescription; +import de.bonndan.nivio.input.dto.SourceReference; +import de.bonndan.nivio.util.URLHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class ItemDescriptionFactoryRancher1 implements ItemDescriptionFactory { + + private static final Logger logger = LoggerFactory.getLogger(ItemDescriptionFactoryRancher1.class); + private final URL baseUrl; + + public ItemDescriptionFactoryRancher1(URL baseUrl) { + this.baseUrl = baseUrl; + } + + @Override + public List getDescriptions(SourceReference reference) { + + String landscape = reference.getLandscapeDescription().getIdentifier(); + + String combine = URLHelper.combine(baseUrl, reference.getUrl()); + try { + URL url = new URL(combine); + PrometheusExporter prometheusExporter = new PrometheusExporter(landscape, url); + return prometheusExporter.getDescriptions(); + } catch (MalformedURLException e) { + logger.error("Could not work on prometheus url {}", combine); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporter.java b/src/main/java/de/bonndan/nivio/input/rancher1/PrometheusExporter.java similarity index 61% rename from src/main/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporter.java rename to src/main/java/de/bonndan/nivio/input/rancher1/PrometheusExporter.java index fffdfc7e9..22b10ccdf 100644 --- a/src/main/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporter.java +++ b/src/main/java/de/bonndan/nivio/input/rancher1/PrometheusExporter.java @@ -1,10 +1,9 @@ -package de.bonndan.nivio.stateaggregation.provider; +package de.bonndan.nivio.input.rancher1; +import de.bonndan.nivio.input.ItemDescriptionFactory; +import de.bonndan.nivio.input.dto.ItemDescription; import de.bonndan.nivio.input.dto.StatusDescription; -import de.bonndan.nivio.model.FullyQualifiedIdentifier; -import de.bonndan.nivio.model.Status; -import de.bonndan.nivio.model.StatusItem; -import de.bonndan.nivio.stateaggregation.Provider; +import de.bonndan.nivio.model.*; import org.hawkular.agent.prometheus.PrometheusDataFormat; import org.hawkular.agent.prometheus.PrometheusScraper; import org.hawkular.agent.prometheus.types.Gauge; @@ -16,11 +15,9 @@ import java.io.File; import java.io.IOException; import java.net.URL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; -public class PrometheusExporter implements Provider { +public class PrometheusExporter { private static final Logger logger = LoggerFactory.getLogger(PrometheusExporter.class); @@ -38,9 +35,9 @@ public PrometheusExporter(String landscape, URL target) { this.target = target; } - public Map getStates() { + public List getDescriptions() { PrometheusScraper prometheusScraper = getScraper(); - final Map tmp = new HashMap<>(); + final Map tmp = new HashMap<>(); try { List scrape = prometheusScraper.scrape(); scrape.forEach(metricFamily -> { @@ -52,22 +49,20 @@ public Map getStates() { if ("rancher_stack_state".equals(metricFamily.getName())) return; - metricFamily.getMetrics().forEach(metric -> { - - FullyQualifiedIdentifier fqi = toFQI(metric); - if (fqi == null) - return; - StatusItem item = toStatusItem(metric); - if (item != null) - putIfHigher(fqi, item, tmp); - }); + metricFamily.getMetrics().stream() + .map(this::toItem) + .filter(Objects::nonNull) + .forEach(itemDescription -> { + ItemDescription inMap = tmp.computeIfAbsent(itemDescription.getFullyQualifiedIdentifier(), ItemDescription::new); + ItemDescriptionFactory.assignNotNull(inMap, itemDescription); + }); }); } catch (IOException e) { logger.error("Failed to scrape " + target, e); } - return tmp; + return new ArrayList<>(tmp.values()); } private void putIfHigher(FullyQualifiedIdentifier fqi, StatusItem serviceState, Map tmp) { @@ -84,27 +79,45 @@ private void putIfHigher(FullyQualifiedIdentifier fqi, StatusItem serviceState, } - private StatusItem toStatusItem(Metric metric) { + private ItemDescription toItem(Metric metric) { - StatusItem state = null; + ItemDescription itemDescription = null; if (metric instanceof Gauge) { - state = processGauge((Gauge) metric); + + itemDescription = processGauge((Gauge) metric); + FullyQualifiedIdentifier fqi = toFQI(metric); + if (fqi != null) { + itemDescription.setIdentifier(fqi.getIdentifier()); + itemDescription.setGroup(fqi.getGroup()); + } } - return state; + return itemDescription; } - private StatusItem processGauge(Gauge metric) { + private ItemDescription processGauge(Gauge metric) { + + ItemDescription itemDescription = new ItemDescription(); if (metric.getName().equals("rancher_service_health_status")) { + + StatusDescription health_state = null; if (metric.getLabels().getOrDefault("health_state", "").equals("healthy") && metric.getValue() > 0) { - return new StatusDescription(StatusItem.HEALTH, Status.GREEN, metric.getLabels().getOrDefault("health_state", "")); + health_state = new StatusDescription(StatusItem.HEALTH, Status.GREEN, metric.getLabels().getOrDefault("health_state", "")); } + if (metric.getLabels().getOrDefault("health_state", "").equals("unhealthy") && metric.getValue() > 0) { - return new StatusDescription(StatusItem.HEALTH, Status.ORANGE, metric.getLabels().getOrDefault("health_state", "")); + health_state = new StatusDescription(StatusItem.HEALTH, Status.ORANGE, metric.getLabels().getOrDefault("health_state", "")); } + if (health_state != null) + itemDescription.setStatus(health_state); } - return null; + + //TODO add scale gauge + + //TODO add service state (active...) + + return itemDescription; } private FullyQualifiedIdentifier toFQI(Metric metric) { diff --git a/src/main/java/de/bonndan/nivio/model/ServiceItems.java b/src/main/java/de/bonndan/nivio/model/Items.java similarity index 90% rename from src/main/java/de/bonndan/nivio/model/ServiceItems.java rename to src/main/java/de/bonndan/nivio/model/Items.java index 2d129686b..419efc08b 100644 --- a/src/main/java/de/bonndan/nivio/model/ServiceItems.java +++ b/src/main/java/de/bonndan/nivio/model/Items.java @@ -17,7 +17,7 @@ import static com.googlecode.cqengine.query.QueryFactory.attribute; import static de.bonndan.nivio.model.LandscapeItem.IDENTIFIER_VALIDATION; -public class ServiceItems { +public class Items { /** * Ensures that the given item has a sibling in the list, returns the item from the list. @@ -33,7 +33,7 @@ public static LandscapeItem pick(final LandscapeItem item, final Collection find(String identifier, String group, Collection items) { if (StringUtils.isEmpty(identifier)) { @@ -71,18 +71,18 @@ public static Optional find(String identifier, String group, Coll private static List findAll( final String identifier, final String group, - final Collection serviceList + final Collection items ) { FullyQualifiedIdentifier fqi; if (group == null) fqi = FullyQualifiedIdentifier.from(identifier); else fqi = FullyQualifiedIdentifier.build(null, group, identifier); - return findAll(fqi, serviceList); + return findAll(fqi, items); } - private static List findAll(FullyQualifiedIdentifier fqi, Collection serviceList) { - return serviceList.stream() + private static List findAll(FullyQualifiedIdentifier fqi, Collection items) { + return items.stream() .filter(fqi::isSimilarTo) .collect(Collectors.toList()); } @@ -90,9 +90,9 @@ private static List findAll(FullyQualifiedIdentifier fqi, Collect /** * Returns a the item from the list or null. Uses the matching criteria of {@link FullyQualifiedIdentifier} * - * @param fqi the service identifier + * @param fqi the identifier * @param items all items - * @return the service or null + * @return the or null */ public static Optional find(FullyQualifiedIdentifier fqi, Collection items) { List found = findAll(fqi, items); @@ -111,7 +111,7 @@ public static Collection filter(String condition, Colle //single word compared against identifier if (condition.matches(IDENTIFIER_VALIDATION)) { return items.stream() - .filter(serviceItem -> serviceItem.getIdentifier().equals(condition)) + .filter(item -> item.getIdentifier().equals(condition)) .collect(Collectors.toList()); } diff --git a/src/main/java/de/bonndan/nivio/model/Landscape.java b/src/main/java/de/bonndan/nivio/model/Landscape.java index aae27a980..6f7a6db46 100644 --- a/src/main/java/de/bonndan/nivio/model/Landscape.java +++ b/src/main/java/de/bonndan/nivio/model/Landscape.java @@ -1,6 +1,5 @@ package de.bonndan.nivio.model; -import java.util.List; import java.util.Map; public interface Landscape { @@ -16,8 +15,6 @@ public interface Landscape { */ String getSource(); - List getStateProviders(); - LandscapeConfig getConfig(); /** diff --git a/src/main/java/de/bonndan/nivio/model/LandscapeImpl.java b/src/main/java/de/bonndan/nivio/model/LandscapeImpl.java index 3abf5e0a5..df07ad5cd 100644 --- a/src/main/java/de/bonndan/nivio/model/LandscapeImpl.java +++ b/src/main/java/de/bonndan/nivio/model/LandscapeImpl.java @@ -33,8 +33,6 @@ public class LandscapeImpl implements Landscape { @JsonManagedReference private Set items = new HashSet<>(); - private List stateProviders = new ArrayList<>(); - private LandscapeConfig config; private Map groups = new HashMap<>(); @@ -76,11 +74,6 @@ public String getContact() { return contact; } - @Override - public List getStateProviders() { - return stateProviders; - } - @Override public LandscapeConfig getConfig() { return config == null ? new LandscapeConfig() : config; @@ -115,10 +108,6 @@ public int hashCode() { return Objects.hash(StringUtils.trimAllWhitespace(identifier)); } - public void setStateProviders(List stateProviders) { - this.stateProviders = stateProviders; - } - public void setConfig(LandscapeConfig config) { this.config = config; } diff --git a/src/main/java/de/bonndan/nivio/model/StateProviderConfig.java b/src/main/java/de/bonndan/nivio/model/StateProviderConfig.java deleted file mode 100644 index 33124cca1..000000000 --- a/src/main/java/de/bonndan/nivio/model/StateProviderConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package de.bonndan.nivio.model; - -import java.io.Serializable; - -public class StateProviderConfig implements Serializable { - - public static final String TYPE_PROMETHEUS_EXPORTER = "prometheus-exporter"; - - private String type; - private String target; - - public StateProviderConfig() { - - } - - public StateProviderConfig(String type, String target) { - this.type = type; - this.target = target; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getTarget() { - return target; - } - - public void setTarget(String target) { - this.target = target; - } - - @Override - public String toString() { - return "[" + type + " with target: " + target + "]"; - } -} diff --git a/src/main/java/de/bonndan/nivio/stateaggregation/ServiceStateChangeEvent.java b/src/main/java/de/bonndan/nivio/notification/ServiceStateChangeEvent.java similarity index 93% rename from src/main/java/de/bonndan/nivio/stateaggregation/ServiceStateChangeEvent.java rename to src/main/java/de/bonndan/nivio/notification/ServiceStateChangeEvent.java index 927b0aea4..4d509bf3e 100644 --- a/src/main/java/de/bonndan/nivio/stateaggregation/ServiceStateChangeEvent.java +++ b/src/main/java/de/bonndan/nivio/notification/ServiceStateChangeEvent.java @@ -1,9 +1,10 @@ -package de.bonndan.nivio.stateaggregation; +package de.bonndan.nivio.notification; import de.bonndan.nivio.model.FullyQualifiedIdentifier; import de.bonndan.nivio.model.StatusItem; import org.springframework.context.ApplicationEvent; +//TODO use public class ServiceStateChangeEvent extends ApplicationEvent { private final FullyQualifiedIdentifier fqi; private final StatusItem old; diff --git a/src/main/java/de/bonndan/nivio/output/jgrapht/GraphBuilder.java b/src/main/java/de/bonndan/nivio/output/jgrapht/GraphBuilder.java index f566da0b0..0b5e2f514 100644 --- a/src/main/java/de/bonndan/nivio/output/jgrapht/GraphBuilder.java +++ b/src/main/java/de/bonndan/nivio/output/jgrapht/GraphBuilder.java @@ -29,7 +29,7 @@ private void addService(Item item) { private void addLinks(Item item) { item.getDataFlow().forEach(flow -> { - LandscapeItem target = ServiceItems.pick(flow.getTarget(), null, landscape.getItems()); + LandscapeItem target = Items.pick(flow.getTarget(), null, landscape.getItems()); graph.addEdge(item, target, new LabeledEdge(flow.getDescription())); }); } diff --git a/src/main/java/de/bonndan/nivio/output/jgraphx/AllGroupsGraph.java b/src/main/java/de/bonndan/nivio/output/jgraphx/AllGroupsGraph.java index 317a82c00..a1ba6f31b 100644 --- a/src/main/java/de/bonndan/nivio/output/jgraphx/AllGroupsGraph.java +++ b/src/main/java/de/bonndan/nivio/output/jgraphx/AllGroupsGraph.java @@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; -import java.awt.geom.Rectangle2D; import java.util.*; /** @@ -99,7 +98,7 @@ private void addVirtualEdgesBetweenGroups(List items) { service.getDataFlow().forEach(dataFlowItem -> { String target = dataFlowItem.getTarget(); if (target == null) return; - LandscapeItem targetItem = ServiceItems.find(target, null, items).orElse(null); + LandscapeItem targetItem = Items.find(target, null, items).orElse(null); if (targetItem == null) return; String targetGroup = targetItem.getGroup() == null ? Groups.COMMON : targetItem.getGroup(); diff --git a/src/main/java/de/bonndan/nivio/output/jgraphx/FinalGraph.java b/src/main/java/de/bonndan/nivio/output/jgraphx/FinalGraph.java index d5e5d84fe..ed16d1599 100644 --- a/src/main/java/de/bonndan/nivio/output/jgraphx/FinalGraph.java +++ b/src/main/java/de/bonndan/nivio/output/jgraphx/FinalGraph.java @@ -109,7 +109,7 @@ private void addDataFlow(List items) { String id = "df_" + service.getIdentifier() + df.getTarget(); logger.info("Adding dataflow " + id); - ServiceItems.find(FullyQualifiedIdentifier.from(df.getTarget()), items).ifPresent(target -> { + Items.find(FullyQualifiedIdentifier.from(df.getTarget()), items).ifPresent(target -> { graph.insertEdge(graph.getDefaultParent(), id, df.getFormat(), serviceVertexes.get(service), serviceVertexes.get(target), diff --git a/src/main/java/de/bonndan/nivio/output/jgraphx/JsonRenderer.java b/src/main/java/de/bonndan/nivio/output/jgraphx/JsonRenderer.java index 8af30b3e0..adf37c11d 100644 --- a/src/main/java/de/bonndan/nivio/output/jgraphx/JsonRenderer.java +++ b/src/main/java/de/bonndan/nivio/output/jgraphx/JsonRenderer.java @@ -69,7 +69,7 @@ private Serializable toDto(mxCell cell, Collection items) { LandscapeItem landscapeItem = null; if (!StringUtils.isEmpty(cell.getId())) - landscapeItem = ServiceItems.find(FullyQualifiedIdentifier.from(cell.getId()), items).orElse(null); + landscapeItem = Items.find(FullyQualifiedIdentifier.from(cell.getId()), items).orElse(null); Vertex vertex = new Vertex(); vertex.id = cell.getId(); vertex.name = (String) cell.getValue(); diff --git a/src/main/java/de/bonndan/nivio/stateaggregation/Aggregator.java b/src/main/java/de/bonndan/nivio/stateaggregation/Aggregator.java deleted file mode 100644 index f8cfc7f4c..000000000 --- a/src/main/java/de/bonndan/nivio/stateaggregation/Aggregator.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.bonndan.nivio.stateaggregation; - -import com.jasongoodwin.monads.Try; -import de.bonndan.nivio.ProcessingErrorEvent; -import de.bonndan.nivio.ProcessingException; -import de.bonndan.nivio.model.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Service -public class Aggregator { - - private final static Logger logger = LoggerFactory.getLogger(Aggregator.class); - - private final LandscapeRepository landscapeRepository; - - private final ProviderFactory factory; - - private final ApplicationEventPublisher publisher; - - @Autowired - public Aggregator(LandscapeRepository landscapeRepository, - ProviderFactory factory, - ApplicationEventPublisher publisher - ) { - this.landscapeRepository = landscapeRepository; - this.factory = factory; - this.publisher = publisher; - } - - public void fetch(Landscape landscape) { - - getProviders(landscape).forEach(provider -> { - try { - applyUpdates(provider.getStates()); - } catch (Throwable throwable) { - String msg = "Failed to getStates state using provider " + provider; - handleError(landscape, throwable, msg); - } - }); - - } - - private void applyUpdates(Map updates) { - updates.forEach((fqi, item) -> { - landscapeRepository.findDistinctByIdentifier(fqi.getLandscape()) - .ifPresentOrElse(landscape -> { - ServiceItems.find(fqi, landscape.getItems()).ifPresent(serviceItem -> serviceItem.setStatus(item)); - }, - () -> { - } - ); - }); - } - - private List getProviders(Landscape landscape) { - List providers = new ArrayList<>(); - landscape.getStateProviders() - .forEach(config -> - Try.ofFailable(() -> factory.createFor(landscape, config)) - .onSuccess(providers::add) - .onFailure(throwable -> handleError(landscape, throwable, "Failed to create state provider")) - .toOptional() - ); - - return providers; - } - - private void handleError(Landscape landscape, Throwable throwable, String msg) { - logger.error(msg, throwable); - publisher.publishEvent(new ProcessingErrorEvent(this, ProcessingException.of(landscape, throwable))); - } -} - diff --git a/src/main/java/de/bonndan/nivio/stateaggregation/Provider.java b/src/main/java/de/bonndan/nivio/stateaggregation/Provider.java deleted file mode 100644 index b8253c5d2..000000000 --- a/src/main/java/de/bonndan/nivio/stateaggregation/Provider.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.bonndan.nivio.stateaggregation; - -import de.bonndan.nivio.model.FullyQualifiedIdentifier; -import de.bonndan.nivio.model.StatusItem; - -import java.util.Map; - -public interface Provider { - - /** - * The provider is expected return a map of service states. - * - */ - Map getStates(); - -} diff --git a/src/main/java/de/bonndan/nivio/stateaggregation/ProviderFactory.java b/src/main/java/de/bonndan/nivio/stateaggregation/ProviderFactory.java deleted file mode 100644 index 16460256c..000000000 --- a/src/main/java/de/bonndan/nivio/stateaggregation/ProviderFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.bonndan.nivio.stateaggregation; - -import de.bonndan.nivio.ProcessingException; -import de.bonndan.nivio.model.Landscape; -import de.bonndan.nivio.model.StateProviderConfig; -import de.bonndan.nivio.stateaggregation.provider.PrometheusExporter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.net.MalformedURLException; -import java.net.URL; - -@Component -public class ProviderFactory { - - private static final Logger logger = LoggerFactory.getLogger(ProviderFactory.class); - - public Provider createFor(Landscape landscape, StateProviderConfig config) { - - if (StateProviderConfig.TYPE_PROMETHEUS_EXPORTER.equals(config.getType())) { - try { - return new PrometheusExporter(landscape.getIdentifier(), new URL(config.getTarget())); - } catch (MalformedURLException e) { - String msg = "Landscape " + landscape.getIdentifier() + " has malformed provider config for type " + config.getType(); - logger.error(msg, e); - throw new ProcessingException(landscape, msg, e); - } - } - - throw new ProcessingException(landscape, "Could not create state provider from config " + config); - } -} diff --git a/src/main/java/de/bonndan/nivio/util/URLHelper.java b/src/main/java/de/bonndan/nivio/util/URLHelper.java index 0a2da66d3..33132d811 100644 --- a/src/main/java/de/bonndan/nivio/util/URLHelper.java +++ b/src/main/java/de/bonndan/nivio/util/URLHelper.java @@ -44,6 +44,9 @@ public static String combine(URL baseUrl, String part) { if (part == null) return baseUrl.toString(); + if (part.startsWith(baseUrl.toString())) + return part; + String combined = baseUrl.toString().endsWith("/") ? baseUrl.toString() : baseUrl.toString() + "/"; return combined + (part.startsWith("./") ? part.substring(2) : part); } diff --git a/src/test/java/de/bonndan/nivio/input/IndexerIntegrationTest.java b/src/test/java/de/bonndan/nivio/input/IndexerIntegrationTest.java index f91857047..6922a3c0c 100644 --- a/src/test/java/de/bonndan/nivio/input/IndexerIntegrationTest.java +++ b/src/test/java/de/bonndan/nivio/input/IndexerIntegrationTest.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.Set; -import static de.bonndan.nivio.model.ServiceItems.pick; +import static de.bonndan.nivio.model.Items.pick; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(SpringExtension.class) @@ -67,11 +67,11 @@ public void testIndexing() { assertEquals("mail@acme.org", landscape.getContact()); Assertions.assertNotNull(landscape.getItems()); assertEquals(8, landscape.getItems().size()); - Item blog = (Item) ServiceItems.pick("blog-server", null, landscape.getItems()); + Item blog = (Item) Items.pick("blog-server", null, landscape.getItems()); Assertions.assertNotNull(blog); assertEquals(3, blog.getProvidedBy().size()); - Item webserver = (Item) ServiceItems.pick("wordpress-web", null, new ArrayList<>(blog.getProvidedBy())); + Item webserver = (Item) Items.pick("wordpress-web", null, new ArrayList<>(blog.getProvidedBy())); Assertions.assertNotNull(webserver); assertEquals(1, webserver.getProvides().size()); @@ -105,11 +105,11 @@ public void testReIndexing() { assertEquals("mail@acme.org", landscape.getContact()); Assertions.assertNotNull(landscape.getItems()); assertEquals(8, landscape.getItems().size()); - Item blog = (Item) ServiceItems.pick("blog-server", null,landscape.getItems()); + Item blog = (Item) Items.pick("blog-server", null,landscape.getItems()); Assertions.assertNotNull(blog); assertEquals(3, blog.getProvidedBy().size()); - Item webserver = (Item) ServiceItems.pick("wordpress-web", null, new ArrayList(blog.getProvidedBy())); + Item webserver = (Item) Items.pick("wordpress-web", null, new ArrayList(blog.getProvidedBy())); Assertions.assertNotNull(webserver); assertEquals(1, webserver.getProvides().size()); @@ -140,7 +140,7 @@ public void testReIndexing() { @Test public void testIncrementalUpdate() { LandscapeImpl landscape = index(); - Item blog = (Item) ServiceItems.pick("blog-server", null, landscape.getItems()); + Item blog = (Item) Items.pick("blog-server", null, landscape.getItems()); int before = landscape.getItems().size(); LandscapeDescription landscapeDescription = new LandscapeDescription(); @@ -161,12 +161,12 @@ public void testIncrementalUpdate() { //created landscape = (LandscapeImpl) indexer.reIndex(landscapeDescription).getLandscape(); - blog = (Item) ServiceItems.pick("blog-server", "completelyNewGroup", landscape.getItems()); + blog = (Item) Items.pick("blog-server", "completelyNewGroup", landscape.getItems()); assertEquals("completelyNewGroup", blog.getGroup()); assertEquals(before +1, landscape.getItems().size()); //updated - Item wordpress = (Item) ServiceItems.pick("wordpress-web", "content", landscape.getItems()); + Item wordpress = (Item) Items.pick("wordpress-web", "content", landscape.getItems()); assertEquals("Other name", wordpress.getName()); assertEquals("content", wordpress.getGroup()); @@ -184,7 +184,7 @@ public void testNameConflictDifferentLandscapes() { Assertions.assertNotNull(landscape1); assertEquals("mail@acme.org", landscape1.getContact()); Assertions.assertNotNull(landscape1.getItems()); - Item blog1 = (Item) ServiceItems.pick("blog-server", null,landscape1.getItems()); + Item blog1 = (Item) Items.pick("blog-server", null,landscape1.getItems()); Assertions.assertNotNull(blog1); assertEquals("blog", blog1.getShortName()); @@ -192,7 +192,7 @@ public void testNameConflictDifferentLandscapes() { assertEquals("nivio:other", landscape2.getIdentifier()); assertEquals("mail@other.org", landscape2.getContact()); Assertions.assertNotNull(landscape2.getItems()); - Item blog2 = (Item) ServiceItems.pick("blog-server", null,landscape2.getItems()); + Item blog2 = (Item) Items.pick("blog-server", null,landscape2.getItems()); Assertions.assertNotNull(blog2); assertEquals("blog1", blog2.getShortName()); } @@ -206,9 +206,9 @@ public void testDataflow() { Assertions.assertNotNull(landscape1); Assertions.assertNotNull(landscape1.getItems()); - Item blog1 = (Item) ServiceItems.pick("blog-server", "content1",landscape1.getItems()); + Item blog1 = (Item) Items.pick("blog-server", "content1",landscape1.getItems()); Assertions.assertNotNull(blog1); - Item blog2 = (Item) ServiceItems.pick("blog-server", "content2",landscape1.getItems()); + Item blog2 = (Item) Items.pick("blog-server", "content2",landscape1.getItems()); Assertions.assertNotNull(blog2); assertEquals("Demo Blog", blog1.getName()); assertEquals( diff --git a/src/test/java/de/bonndan/nivio/input/LandscapeDescriptionFactoryTest.java b/src/test/java/de/bonndan/nivio/input/LandscapeDescriptionFactoryTest.java index 3a4078fdb..bc2c029fd 100644 --- a/src/test/java/de/bonndan/nivio/input/LandscapeDescriptionFactoryTest.java +++ b/src/test/java/de/bonndan/nivio/input/LandscapeDescriptionFactoryTest.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.Map; -import static de.bonndan.nivio.model.ServiceItems.pick; +import static de.bonndan.nivio.model.Items.pick; import static junit.framework.TestCase.assertNull; import static org.junit.Assert.*; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -79,19 +79,6 @@ public void readIncremental() { assertFalse(landscapeDescription.getSourceReferences().isEmpty()); } - @Test - public void readStateProviders() { - - File file = new File(RootPath.get() + "/src/test/resources/example/example_providers.yml"); - LandscapeDescription landscapeDescription = LandscapeDescriptionFactory.fromYaml(file); - assertFalse(landscapeDescription.getStateProviders().isEmpty()); - - StateProviderConfig cfg = landscapeDescription.getStateProviders().get(0); - assertNotNull(cfg); - assertEquals("prometheus-exporter", cfg.getType()); - assertTrue(cfg.getTarget().contains("example/rancher_prometheus_exporter.txt")); - } - @Test public void readEnvVars() throws IOException, NoSuchFieldException, IllegalAccessException { diff --git a/src/test/java/de/bonndan/nivio/input/LandscapeItemsTest.java b/src/test/java/de/bonndan/nivio/input/LandscapeItemsTest.java index 228a4fa97..28bd4bb14 100644 --- a/src/test/java/de/bonndan/nivio/input/LandscapeItemsTest.java +++ b/src/test/java/de/bonndan/nivio/input/LandscapeItemsTest.java @@ -4,7 +4,7 @@ import de.bonndan.nivio.model.Item; import de.bonndan.nivio.model.LandscapeImpl; import de.bonndan.nivio.model.LandscapeItem; -import de.bonndan.nivio.model.ServiceItems; +import de.bonndan.nivio.model.Items; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,28 +44,28 @@ public void setup() { @Test public void pickFails() { - assertThrows(RuntimeException.class,() -> ServiceItems.pick("s1", "xxx", items)); - assertThrows(RuntimeException.class,() -> ServiceItems.pick("s3", "g1", items)); + assertThrows(RuntimeException.class,() -> Items.pick("s1", "xxx", items)); + assertThrows(RuntimeException.class,() -> Items.pick("s3", "g1", items)); } @Test public void pick() { - assertNotNull(ServiceItems.pick("s1", "g1", items)); - assertNotNull(ServiceItems.pick("s2", "g1", items)); + assertNotNull(Items.pick("s1", "g1", items)); + assertNotNull(Items.pick("s2", "g1", items)); Item s2 = new Item(); s2.setIdentifier("s2"); s2.setGroup("g1"); s2.setLandscape(landscape); - assertNotNull(ServiceItems.pick(s2, items)); + assertNotNull(Items.pick(s2, items)); } @Test public void pickGracefulWithoutGroup() { - assertNotNull(ServiceItems.pick("s2", null, items)); + assertNotNull(Items.pick("s2", null, items)); } @Test @@ -77,7 +77,7 @@ public void pickGracefulFails() { s2.setLandscape(landscape); items.add(s2); - assertThrows(RuntimeException.class,() -> ServiceItems.pick("s2", null, items)); + assertThrows(RuntimeException.class,() -> Items.pick("s2", null, items)); } @Test public void added() { diff --git a/src/test/java/de/bonndan/nivio/input/SourceReferencesResolverTest.java b/src/test/java/de/bonndan/nivio/input/SourceReferencesResolverTest.java index f51bbb75d..79c833092 100644 --- a/src/test/java/de/bonndan/nivio/input/SourceReferencesResolverTest.java +++ b/src/test/java/de/bonndan/nivio/input/SourceReferencesResolverTest.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Set; -import static de.bonndan.nivio.model.ServiceItems.pick; +import static de.bonndan.nivio.model.Items.pick; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/de/bonndan/nivio/input/rancher1/PrometheusExporterTest.java b/src/test/java/de/bonndan/nivio/input/rancher1/PrometheusExporterTest.java new file mode 100644 index 000000000..a94bf1db6 --- /dev/null +++ b/src/test/java/de/bonndan/nivio/input/rancher1/PrometheusExporterTest.java @@ -0,0 +1,64 @@ +package de.bonndan.nivio.input.rancher1; + +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import de.bonndan.nivio.input.FileFetcher; +import de.bonndan.nivio.input.dto.ItemDescription; +import de.bonndan.nivio.model.Items; +import de.bonndan.nivio.model.LandscapeItem; +import de.bonndan.nivio.util.RootPath; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.Optional; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static org.junit.jupiter.api.Assertions.*; + +class PrometheusExporterTest { + + + private WireMockServer wireMockServer; + + @BeforeEach + void configureSystemUnderTest() { + wireMockServer = new WireMockServer(options().dynamicPort()); + wireMockServer.start(); + WireMock.configureFor("localhost", wireMockServer.port()); + } + + @AfterEach + void stopWireMockServer() { + wireMockServer.stop(); + } + + @Test + public void testSuccess() throws MalformedURLException { + + String path = RootPath.get() + "/src/test/resources/example/rancher_prometheus_exporter.txt"; + String prometheusExport = FileFetcher.readFile(new File(path)); + + givenThat( + get("/some/export").willReturn(aResponse().withStatus(200).withBody(prometheusExport)) + ); + + String url = String.format("http://localhost:%d/some/export", wireMockServer.port()); + + + PrometheusExporter exporter = new PrometheusExporter("test", new URL(url)); + List descriptions = exporter.getDescriptions(); + assertNotNull(descriptions); + assertFalse(descriptions.isEmpty()); + Optional op = Items.find("rocketchat", null,descriptions); + assertNotNull(op.get()); + LandscapeItem rocketchat = op.get(); + assertEquals("rocket-chat", rocketchat.getFullyQualifiedIdentifier().getGroup()); + assertEquals(1, rocketchat.getStatuses().size()); + } +} \ No newline at end of file diff --git a/src/test/java/de/bonndan/nivio/output/GraphBuilderTest.java b/src/test/java/de/bonndan/nivio/output/GraphBuilderTest.java index 306886d45..29992f18d 100644 --- a/src/test/java/de/bonndan/nivio/output/GraphBuilderTest.java +++ b/src/test/java/de/bonndan/nivio/output/GraphBuilderTest.java @@ -41,9 +41,9 @@ public void build(){ Graph graph = graphBuilder.build(landscape); Assertions.assertNotNull(graph); - Item a = (Item) ServiceItems.pick("a", null, landscape.getItems()); - Item a1 = (Item) ServiceItems.pick("a1", null, landscape.getItems()); - Item b = (Item) ServiceItems.pick("b", null, landscape.getItems()); + Item a = (Item) Items.pick("a", null, landscape.getItems()); + Item a1 = (Item) Items.pick("a1", null, landscape.getItems()); + Item b = (Item) Items.pick("b", null, landscape.getItems()); Assertions.assertTrue(graph.containsVertex(a)); Object edge1 = graph.getEdge(a, a1); diff --git a/src/test/java/de/bonndan/nivio/stateaggregation/AggregatorTest.java b/src/test/java/de/bonndan/nivio/stateaggregation/AggregatorTest.java deleted file mode 100644 index c502b5160..000000000 --- a/src/test/java/de/bonndan/nivio/stateaggregation/AggregatorTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package de.bonndan.nivio.stateaggregation; - -import de.bonndan.nivio.ProcessingErrorEvent; -import de.bonndan.nivio.ProcessingException; -import de.bonndan.nivio.input.dto.LandscapeDescription; -import de.bonndan.nivio.input.dto.StatusDescription; -import de.bonndan.nivio.model.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.springframework.context.ApplicationEventPublisher; - -import java.util.*; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.mockito.MockitoAnnotations.initMocks; - -public class AggregatorTest { - - @Mock - ProviderFactory factory; - - @Mock - ApplicationEventPublisher publisher; - - @Mock - LandscapeRepository landscapeRepo; - - private Aggregator aggregator; - - private LandscapeImpl landscape; - - private Item item; - - @BeforeEach - void configureSystemUnderTest() { - initMocks(this); - - landscape = new LandscapeImpl(); - landscape.setIdentifier("x"); - - item = new Item(); - item.setIdentifier("z"); - item.setGroup("y"); - landscape.addItem(item); - - when(landscapeRepo.findDistinctByIdentifier(any())).thenReturn(Optional.of(landscape)); - aggregator = new Aggregator(landscapeRepo, factory, publisher); - } - - @Test - public void testWithFactoryErrors() { - - LandscapeDescription e = new LandscapeDescription(); - e.setIdentifier("test"); - e.setStateProviders(List.of(new StateProviderConfig("type", "target"))); - - Mockito.when(factory.createFor(Mockito.any(), Mockito.any())).thenThrow(new ProcessingException(e, "fail")); - - aggregator.fetch(e); - Mockito.verify(publisher, Mockito.atLeastOnce()).publishEvent(Mockito.any(ProcessingErrorEvent.class)); - } - - @Test - public void testAppliesState() { - - LandscapeDescription landscapeDescription = new LandscapeDescription(); - landscapeDescription.setIdentifier("test"); - landscapeDescription.setStateProviders(List.of(new StateProviderConfig(StateProviderConfig.TYPE_PROMETHEUS_EXPORTER, "target"))); - - FullyQualifiedIdentifier fullyQualifiedIdentifier = FullyQualifiedIdentifier.build("x", "y", "z"); - Provider mockProvider = Mockito.mock(Provider.class); - when(mockProvider.getStates()).then(invocationOnMock -> { - Map updates = new HashMap<>(); - updates.put(fullyQualifiedIdentifier, new StatusDescription(StatusItem.HEALTH, Status.RED, "error")); - return updates; - }); - Mockito.when(factory.createFor(Mockito.any(), Mockito.any())) - .thenReturn(mockProvider); - - aggregator.fetch(landscapeDescription); - Set statuses = item.getStatuses(); - assertFalse(statuses.isEmpty()); - assertEquals(1, statuses.size()); - StatusItem s1 = statuses.iterator().next(); - assertNotNull(s1); - assertEquals(Status.RED, s1.getStatus()); - assertEquals("error", s1.getMessage()); - } - - @Test - public void testServiceDeteriorates() { - - item.setStatus(new StatusDescription(StatusItem.HEALTH, Status.GREEN, "ok")); - - LandscapeDescription e = new LandscapeDescription(); - e.setIdentifier("test"); - e.setStateProviders(List.of(new StateProviderConfig(StateProviderConfig.TYPE_PROMETHEUS_EXPORTER, "target"))); - - FullyQualifiedIdentifier fullyQualifiedIdentifier = FullyQualifiedIdentifier.build("x", "y", "z"); - - Provider mockProvider = Mockito.mock(Provider.class); - when(mockProvider.getStates()).then(invocationOnMock -> { - Map updates = new HashMap<>(); - updates.put(fullyQualifiedIdentifier, new StatusDescription(StatusItem.HEALTH, Status.RED, "error")); - return updates; - }); - - Mockito.when(factory.createFor(Mockito.any(), Mockito.any())).thenReturn(mockProvider); - - aggregator.fetch(e); - Set statuses = item.getStatuses(); - assertFalse(statuses.isEmpty()); - assertEquals(1, statuses.size()); - StatusItem s1 = statuses.iterator().next(); - assertNotNull(s1); - assertEquals(StatusItem.HEALTH, s1.getLabel()); - assertEquals(Status.RED, s1.getStatus()); - assertEquals("error", s1.getMessage()); - } - - @Test - public void testServiceRecovers() { - - item.setStatus(new StatusDescription(StatusItem.HEALTH, Status.RED, "error")); - - LandscapeDescription e = new LandscapeDescription(); - e.setIdentifier("test"); - e.setStateProviders(List.of(new StateProviderConfig(StateProviderConfig.TYPE_PROMETHEUS_EXPORTER, "target"))); - FullyQualifiedIdentifier fullyQualifiedIdentifier = FullyQualifiedIdentifier.build("x", "y", "z"); - - Provider mockProvider = Mockito.mock(Provider.class); - when(mockProvider.getStates()).then(invocationOnMock -> { - Map updates = new HashMap<>(); - updates.put(fullyQualifiedIdentifier, new StatusDescription(StatusItem.HEALTH, Status.ORANGE, "better")); - return updates; - }); - - Mockito.when(factory.createFor(Mockito.any(), Mockito.any())).thenReturn(mockProvider); - - aggregator.fetch(e); - - Set statuses = item.getStatuses(); - assertFalse(statuses.isEmpty()); - assertEquals(1, statuses.size()); - StatusItem s1 = statuses.iterator().next(); - assertNotNull(s1); - assertEquals(Status.ORANGE, s1.getStatus()); - assertEquals("better", s1.getMessage()); - } -} diff --git a/src/test/java/de/bonndan/nivio/stateaggregation/ProviderFactoryTest.java b/src/test/java/de/bonndan/nivio/stateaggregation/ProviderFactoryTest.java deleted file mode 100644 index f6213abb0..000000000 --- a/src/test/java/de/bonndan/nivio/stateaggregation/ProviderFactoryTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.bonndan.nivio.stateaggregation; - -import de.bonndan.nivio.ProcessingException; -import de.bonndan.nivio.input.dto.LandscapeDescription; -import de.bonndan.nivio.model.StateProviderConfig; -import de.bonndan.nivio.stateaggregation.provider.PrometheusExporter; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -public class ProviderFactoryTest { - - @Test - public void testUrlFailure() { - StateProviderConfig cfg = new StateProviderConfig(); - cfg.setType(StateProviderConfig.TYPE_PROMETHEUS_EXPORTER); - cfg.setTarget("malformedurl"); - - ProviderFactory providerFactory = new ProviderFactory(); - assertThrows(ProcessingException.class,() -> providerFactory.createFor(new LandscapeDescription(), cfg)); - } - - @Test - public void testCfgFailure() { - StateProviderConfig cfg = new StateProviderConfig(); - cfg.setType("foobar"); - cfg.setTarget("http://good.url"); - - ProviderFactory providerFactory = new ProviderFactory(); - assertThrows(ProcessingException.class,() -> providerFactory.createFor(new LandscapeDescription(), cfg)); - } - - public void testSuccess() { - - StateProviderConfig cfg = new StateProviderConfig(); - cfg.setType(StateProviderConfig.TYPE_PROMETHEUS_EXPORTER); - cfg.setTarget("http://good.url"); - - ProviderFactory providerFactory = new ProviderFactory(); - Provider provider = providerFactory.createFor(new LandscapeDescription(), cfg); - assertNotNull(provider); - assertTrue(provider instanceof PrometheusExporter); - } -} diff --git a/src/test/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporterTest.java b/src/test/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporterTest.java deleted file mode 100644 index c3400259d..000000000 --- a/src/test/java/de/bonndan/nivio/stateaggregation/provider/PrometheusExporterTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.bonndan.nivio.stateaggregation.provider; - -import de.bonndan.nivio.model.FullyQualifiedIdentifier; -import de.bonndan.nivio.model.Status; -import de.bonndan.nivio.model.StatusItem; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -public class PrometheusExporterTest { - - @Test - public void read() { - File file = new File(getRootPath() + "/src/test/resources/example/rancher_prometheus_exporter.txt"); - PrometheusExporter prometheusExporter = new PrometheusExporter("test", file); - - Map states = prometheusExporter.getStates(); - - assertEquals(4, states.size()); - StatusItem hubot = states.get(FullyQualifiedIdentifier.build("test", "rocket-chat", "hubot")); - assertNotNull(hubot); - assertEquals(Status.GREEN, hubot.getStatus(),hubot.getMessage()); - } - - private String getRootPath() { - Path currentRelativePath = Paths.get(""); - return currentRelativePath.toAbsolutePath().toString(); - } -} diff --git a/src/test/resources/example/example_providers.yml b/src/test/resources/example/example_providers.yml deleted file mode 100644 index 23a00606c..000000000 --- a/src/test/resources/example/example_providers.yml +++ /dev/null @@ -1,9 +0,0 @@ -identifier: nivio:example -name: State Provider example -contact: mail@acme.org -sources: - - "./services/wordpress.yml" - -stateProviders: - - type: prometheus-exporter - target: classpath://example/rancher_prometheus_exporter.txt \ No newline at end of file diff --git a/src/test/resources/example/example_rancherprom.yml b/src/test/resources/example/example_rancherprom.yml new file mode 100644 index 000000000..2d6b368c9 --- /dev/null +++ b/src/test/resources/example/example_rancherprom.yml @@ -0,0 +1,5 @@ +identifier: nivio:rancherprom + +sources: + - url: http://localhost:3000/rancher_prometheus_exporter.txt + format: rancher1-prometheus \ No newline at end of file