@Override public void update() { cachedStatus = applicationStatus( cachedStatus.application, cachedStatus.cluster, cachedStatus.system, cachedStatus.vcs, cachedStatus.team, indicators .stream() .flatMap(i -> i.statusDetails().stream()) .collect(toList())); }
public static ApplicationStatus applicationStatus(final ApplicationInfo applicationInfo, final ClusterInfo clusterInfo, final SystemInfo systemInfo, final VersionInfo versionInfo, final TeamInfo teamInfo, final List<StatusDetail> details) { return new ApplicationStatus(applicationInfo, clusterInfo, systemInfo, versionInfo, teamInfo, details); }
@Override public void update() { this.cachedStatus = applicationStatus(applicationInfo, systemInfo, versionInfo, teamInfo, getStatusDetails(indicators), serviceSpecs); }
public static ApplicationStatus applicationStatus(final ApplicationInfo applicationInfo, final SystemInfo systemInfo, final VersionInfo versionInfo, final TeamInfo teamInfo, final List<StatusDetail> details, final List<ServiceSpec> serviceSpecs) { return new ApplicationStatus(applicationInfo, systemInfo, versionInfo, teamInfo, details, serviceSpecs); }
/** * By default, a CachedApplicationStatusAggregator is used. The status is updated using a * {@link de.otto.edison.status.scheduler.Scheduler} every now and then. * * @param applicationInfo Information about the application * @param versionInfo Information about the application's version * @param systemInfo Information about the system * @param teamInfo Information about the team responsible for this application * @return ApplicationStatusAggregator */ @Bean @ConditionalOnMissingBean(ApplicationStatusAggregator.class) public ApplicationStatusAggregator applicationStatusAggregator(final ApplicationInfo applicationInfo, final VersionInfo versionInfo, final SystemInfo systemInfo, final TeamInfo teamInfo) { final List<StatusDetailIndicator> indicators = statusDetailIndicators != null ? statusDetailIndicators : emptyList(); return new CachedApplicationStatusAggregator( applicationStatus(applicationInfo, clusterInfo, systemInfo, versionInfo, teamInfo, emptyList()), indicators); }
@Test public void shouldHaveStatusOkIfDetailsAreOk() { // given final ApplicationStatus applicationStatus = applicationStatus(mock(ApplicationInfo.class), null, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), singletonList( statusDetail("bar", OK, "a message")) ); // then assertThat(applicationStatus.status, is(OK)); }
@Test public void shouldCreateStatusRepresentationWithoutClusterInfo() { // given final ClusterInfo cluster = clusterInfo("", ""); final StatusRepresentation json = statusRepresentationOf( applicationStatus(mock(ApplicationInfo.class), cluster, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList()) ); // then assertThat(json.cluster, is(nullValue())); }
@Test public void shouldCreateStatusRepresentationWithSingleDetail() { // given final StatusRepresentation json = statusRepresentationOf( applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), singletonList( statusDetail("someDetail", WARNING, "detailed warning")) ) ); // then assertThat(json.application.status, is(WARNING)); @SuppressWarnings("unchecked") final Map<String, String> someDetail = (Map) json.application.statusDetails.get("someDetail"); assertThat(someDetail.get("status"), is("WARNING")); assertThat(someDetail.get("message"), is("detailed warning")); assertThat(someDetail.get("link"), is(nullValue())); }
@Test public void shouldCreateStatusRepresentationWithVersionInfo() { // given final StatusRepresentation json = statusRepresentationOf( applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), VersionInfo.versionInfo(versionInfoProperties("1.0.0", "0815", "http://example.org/commits/{commit}")), mock(TeamInfo.class), emptyList()) ); // then assertThat(json.application.version, is("1.0.0")); assertThat(json.application.commit, is("0815")); assertThat(json.application.vcsUrl, is("http://example.org/commits/0815")); }
@Test public void shouldCreateStatusRepresentationWithoutDetails() { // given EdisonApplicationProperties edisonApplicationProperties = edisonApplicationProperties("Some Title", "group", "local-env", "desc"); final StatusRepresentation json = statusRepresentationOf( applicationStatus(applicationInfo("app-name", edisonApplicationProperties), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList()) ); // then assertThat(json.application.name, is("app-name")); assertThat(json.application.title, is("Some Title")); assertThat(json.application.status, is(OK)); assertThat(json.application.statusDetails.size(), is(0)); }
@Test public void shouldHaveStatusWarningIfDetailsContainWarnings() { // given final ApplicationStatus applicationStatus = applicationStatus(mock(ApplicationInfo.class), null, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), asList( statusDetail("bar", OK, "a message"), statusDetail("foobar", WARNING, "another message")) ); // then assertThat(applicationStatus.status, is(WARNING)); }
@Test public void shouldHaveStatusErrorIfDetailsContainWarnings() { // given final ApplicationStatus applicationStatus = applicationStatus(mock(ApplicationInfo.class), null, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), asList( statusDetail("bar", OK, "a message"), statusDetail("foobar", ERROR, "another message"), statusDetail("foobar", WARNING, "yet another message")) ); // then assertThat(applicationStatus.status, is(ERROR)); }
@Test public void shouldCreateStatusRepresentationWithClusterInfo() { // given final ClusterInfo cluster = clusterInfo("BLU", "active"); final StatusRepresentation json = statusRepresentationOf( applicationStatus(mock(ApplicationInfo.class), cluster, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList()) ); // then assertThat(json.cluster.getColor(), is("BLU")); assertThat(json.cluster.getColorState(), is("active")); }
@Test public void shouldCreateStatusRepresentationWithMultipleDetails() { // given final Map<String, String> detailMap = new HashMap<>(); detailMap.put("Count", "1000"); final StatusRepresentation json = statusRepresentationOf( applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), asList( statusDetail("Some Detail", OK, "perfect"), statusDetail("Some Other Detail", WARNING, "detailed warning", detailMap)) ) ); // then assertThat(json.application.status, is(WARNING)); @SuppressWarnings("unchecked") final Map<String, String> someDetail = (Map) json.application.statusDetails.get("someDetail"); assertThat(someDetail.get("status"), is("OK")); assertThat(someDetail.get("message"), is("perfect")); assertThat(someDetail.get("status"), is("OK")); @SuppressWarnings("unchecked") final Map<String, String> someOtherDetail = (Map) json.application.statusDetails.get("someOtherDetail"); assertThat(someOtherDetail.get("status"), is("WARNING")); assertThat(someOtherDetail.get("message"), is("detailed warning")); assertThat(someOtherDetail.get("count"), is("1000")); } }
@Test public void shouldCreateStatusRepresentationWithDetailInclUrl() { // given final StatusRepresentation json = statusRepresentationOf( applicationStatus( mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), singletonList( statusDetail("someDetail", OK, "some message", link("item", "http://example.org/some/url", "some title")) ) ) ); // then assertThat(json.application.status, is(OK)); final JsonMap jsonMap = jsonMapFrom(json.application.statusDetails.get("someDetail")); final JsonMap link = jsonMap.get("links").asListOf(JsonMap.class).get(0); assertThat(link.getString("href"), is("http://example.org/some/url")); assertThat(link.getString("title"), is("some title")); assertThat(link.getString("rel"), is("item")); }