Merge branch 'master' into bug5837

This commit is contained in:
Niklas Opiela
2023-04-20 15:30:54 +02:00
20 changed files with 187 additions and 13 deletions
+3 -3
View File
@@ -112,8 +112,8 @@ fi
echo "Launch a stage build here: https://xmake-mobile-dev.wdf.sap.corp/job/sapsailingprogram/job/sapsailingcapture.android-SP-REL-common_directshipment/"
echo "using $RELEASE_BRANCH as the Treeish to build."
echo "When done, create a BCP update ticket. See https://wiki.wdf.sap.corp/wiki/display/NAAS/Mobile+Patch+Releases \(remove the saprole parameter from the URL\)"
echo "When done, create a BCP update ticket. See https://wiki.wdf.sap.corp/wiki/display/NAAS/Mobile+Patch+Releases (remove the saprole parameter from the URL)"
echo "Copy the description of, e.g., https://support.wdf.sap.corp/sap/support/message/1970099762 to start with and adjust versions and commit IDs."
echo "Make sure you have your MoMa stuff updated, particularly the Release Notes section."
echo "See, e.g., https://moma.mo.sap.corp/#/editAssemblyData/186"
echo "Then wait for feedback on the release build being ready for smoke testing, do the smoke tests and report back in BCP. That\'s it :-\)"
echo "See, e.g., https://moma.mo.sap.corp/#/editAssemblyData/189"
echo "Then wait for feedback on the release build being ready for smoke testing, do the smoke tests and report back in BCP. That's it :-)"
@@ -244,4 +244,6 @@ DistanceToNextBoatToStarboardAtStartOfRacePerpendicularToStartLine=Distance to n
TotalDistanceToNeighboursPerpendicularToStarLineAtStartOfRace=Sum of absolute distances to start line neighbors at race start, perpendicular to start line
TotalWindwardDistanceToNeighboursAtStartOfRace=Sum of absolute windward distances to start line neighbors at race start
TotalDistanceToNeighboursProjectedToStartLineAtStartOfRace=Sum of along-line distances to start line neighbors (or end of line, respectively) at race start
IRM=IRM Code (OCS, DNC, DNF, etc.)
IRM=IRM Code (OCS, DNC, DNF, etc.)
XTE=Cross-Track Error
AbsoluteXTE=Absolute Cross-Track Error
@@ -234,7 +234,7 @@ Bias30SecondsAfterRaceStart=Bias der Startlinie 30 Sekunden nach Start des Renne
RankAtFirstMarkVsFinalRank=Rang bei erster Marke (X) vs. Finaler Rang (Y)
DistanceToAdvantageousSideAtStartOfRaceVsRankAtFirstMark=Relative Distanz zum bevorteilten Ende der Start beim Start des Rennens (X) vs. Position beim ersten Wegpunkt (Y)
DistanceToAdvantageousSideAtStartOfRaceVsFinalRank=Relative Distanz zum bevorteilten Ende der Start beim Start des Rennens (X) vs. Finale Platzierung (Y)
AverageRaceWindSpeed=Durchschnittliche Windgeschwindigkeit f�r Wettfahrt
AverageRaceWindSpeed=Durchschnittliche Windgeschwindigkeit für Wettfahrt
BiasAtStartOfRace=Bias der Startlinie zum Start des Rennens in Meter (negativ: BACKBORD, positiv: STEUERBORD)
DistanceToStarboardSideOfStartLineProjectedOntoLineAtStart=Abstand zur Steuerbordseite der Startlinie, projiziert auf die Linie, zum Start des Rennens
NormalizedDistanceToStarboardSideOfStartLineProjectedOntoLineAtStart=Abstand zur Steuerbordseite der Startlinie, projiziert auf die Linie, zum Start des Rennens, dividiert durch Startlinien-Länge
@@ -247,4 +247,6 @@ DistanceToNextBoatToStarboardAtStartOfRacePerpendicularToStartLine=Abstand zum n
TotalDistanceToNeighboursPerpendicularToStarLineAtStartOfRace=Summe der absoluten Abstände zu beiden Startlinien-Nachbarn, projiziert im rechten Winkel zur Startlinie
TotalWindwardDistanceToNeighboursAtStartOfRace=Summe der windwärtigen absoluten Abstände zu beiden Startlinien-Nachbarn
TotalDistanceToNeighboursProjectedToStartLineAtStartOfRace=Summe der Abstände zu beiden Startlinien-Nachbarn bzw. den Enden der Linie, projiziert auf die Startlinie
IRM=IRM Code (OCS, DNC, DNF etc.)
IRM=IRM Code (OCS, DNC, DNF etc.)
XTE=Querabweichung
AbsoluteXTE=Absolute Querabweichung
@@ -4,6 +4,7 @@ import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sse.common.Bearing;
import com.sap.sse.common.Distance;
import com.sap.sse.datamining.annotations.Connector;
import com.sap.sse.datamining.annotations.Statistic;
@@ -22,4 +23,10 @@ public interface HasGPSFixContext {
@Statistic(messageKey = "VMG", resultDecimals = 2)
SpeedWithBearing getVelocityMadeGood();
@Statistic(messageKey = "XTE", resultDecimals = 2)
Distance getXTE();
@Statistic(messageKey = "AbsoluteXTE", resultDecimals = 2)
Distance getAbsoluteXTE();
}
@@ -7,6 +7,7 @@ import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.Bearing;
import com.sap.sse.common.Distance;
import com.sap.sse.common.TimePoint;
/**
@@ -78,4 +79,14 @@ public class GPSFixWithContext implements HasGPSFixContext {
public SpeedWithBearing getVelocityMadeGood() {
return getTrackedRace().getVelocityMadeGood(getTrackedLegOfCompetitorContext().getCompetitor(), getTimePoint());
}
@Override
public Distance getXTE() {
return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getSignedCrossTrackError(getTimePoint());
}
@Override
public Distance getAbsoluteXTE() {
return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getAbsoluteCrossTrackError(getTimePoint());
}
}
@@ -6,7 +6,7 @@ public enum ScoringSchemeType {
HIGH_POINT_FIRST_GETS_ONE, LOW_POINT_WINNER_GETS_ZERO, HIGH_POINT_WINNER_GETS_SIX, HIGH_POINT_WINNER_GETS_FIVE, HIGH_POINT_WINNER_GETS_EIGHT,
HIGH_POINT_WINNER_GETS_EIGHT_AND_INTERPOLATION, HIGH_POINT_FIRST_GETS_TEN_OR_EIGHT, HIGH_POINT_FIRST_GETS_TWELVE_OR_EIGHT, HIGH_POINT_FIRST_GETS_TWELVE_OR_EIGHT_2017, LOW_POINT_WITH_ELIMINATIONS_AND_ROUNDS_WINNER_GETS_07,
LOW_POINT_LEAGUE_OVERALL, HIGH_POINT_MATCH_RACING, LOW_POINT_TIE_BREAK_BASED_ON_LAST_SERIES_ONLY, LOW_POINT_FIRST_TO_WIN_TWO_RACES, LOW_POINT_FIRST_TO_WIN_THREE_RACES,
HIGH_POINT_BY_WINS_TIES_LASTLY_BROKEN_BY_OTHER_LEADERBOARD;
HIGH_POINT_BY_WINS_TIES_LASTLY_BROKEN_BY_OTHER_LEADERBOARD, LOW_POINT_A82_ONLY;
public static double getScaledScore(double columnFactor, double unscaledScore, boolean oneAlwaysStaysOne) {
return unscaledScore * columnFactor - (oneAlwaysStaysOne ? columnFactor-1 : 0);
@@ -57,6 +57,7 @@ import com.sap.sailing.domain.leaderboard.impl.HighPointWinnerGetsEightAndInterp
import com.sap.sailing.domain.leaderboard.impl.HighPointWinnerGetsFive;
import com.sap.sailing.domain.leaderboard.impl.HighPointWinnerGetsSix;
import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.LowPointA82Only;
import com.sap.sailing.domain.leaderboard.impl.LowPointFirstToWinThreeRaces;
import com.sap.sailing.domain.leaderboard.impl.LowPointFirstToWinTwoRaces;
import com.sap.sailing.domain.leaderboard.impl.LowPointForLeagueOverallLeaderboard;
@@ -158,6 +159,8 @@ public class DomainFactoryImpl extends SharedDomainFactoryImpl<RaceLogAndTracked
return new LowPointFirstToWinThreeRaces();
case HIGH_POINT_BY_WINS_TIES_LASTLY_BROKEN_BY_OTHER_LEADERBOARD:
return new HighPointByWinsTiesLastlyBrokenByOtherLeaderboard();
case LOW_POINT_A82_ONLY:
return new LowPointA82Only();
}
throw new RuntimeException("Unknown scoring scheme type "+scoringSchemeType.name());
}
@@ -0,0 +1,39 @@
package com.sap.sailing.domain.leaderboard.impl;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
/**
* Eliminates the A8.1 comparison (sort scores by better/worst and compare one by one) and hence
* defaults to A8.2 (last race, second-to-last race, etc.).
*
* @author Axel Uhl (d043530)
*
*/
public class LowPointA82Only extends LowPoint {
private static final long serialVersionUID = 4715596377202890920L;
@Override
public int compareByBetterScore(Competitor o1, List<Pair<RaceColumn, Double>> o1Scores, Competitor o2,
List<Pair<RaceColumn, Double>> o2Scores, boolean nullScoresAreBetter, TimePoint timePoint,
Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor,
BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier,
WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) {
return 0;
}
@Override
public ScoringSchemeType getType() {
return ScoringSchemeType.LOW_POINT_A82_ONLY;
}
}
@@ -4,6 +4,13 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Race Manager</h4>
<div class="innerContent">
<h5 class="articleSubheadline">April 2023</h5>
<ul class="bulletList">
<li>Bug fix: added missing handler for Olympic mode Race Log events such as the "result are official"
confirmation event.</li>
<li>Backward compatibility fix: accidentally introduced dependency on newer Android API 24
which caused trouble on older Android versions, e.g., before Android 7.x.</li>
</ul>
<h5 class="articleSubheadline">June 2022</h5>
<ul class="bulletList">
<li>Bug fix: When starting the app after killing it, with unsent messages buffered, fixed
@@ -4,6 +4,10 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Analytics</h4>
<div class="innerContent">
<h5 class="articleSubheadline">April 2023</h5>
<ul class="bulletList">
<li>Added XTE (cross-track error) to data mining statistics on GPS fixes</li>
</ul>
<h5 class="articleSubheadline">March 2023</h5>
<ul class="bulletList">
<li>Added VMG to data mining statistics on GPS fixes</li>
@@ -2426,4 +2426,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboard();
String scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboardDescription();
String helptextLinkingRaces();
String scoringSchemeLowPointA82Only();
String scoringSchemeLowPointA82OnlyDescription();
}
@@ -2463,3 +2463,5 @@ otherTieBreakingLeaderboard=Other tie-breaking leaderboard
scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboard=High Point System, Match Racing, Tie-Break Based on other Leaderboard
scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboardDescription=The winner of a race gets 1 point, all others 0; ties are broken on last race, then based on another leaderboard
helptextLinkingRaces=In order to link races to tracked races, you must left-click a race in the table below and after that left-click the corresponding entry in the tracked races table on the right.
scoringSchemeLowPointA82Only=Low Point System; Tie-Break According to RRS A8.2 (Last Race)
scoringSchemeLowPointA82OnlyDescription=Low Point System; Tie-Break According to RRS A8.2; If a tie remains after looking at the medal race participation and scores, compare the scores in the last race (including scores excluded), then the second-to-last race, etc., until the tie is broken.
@@ -2458,4 +2458,6 @@ goToSelfServicePortalDialogText=Self-Service Portal des Abonementanbieters in ei
failedFetchingSelfServicePortalSession=Self-Service Portal konnte nicht geöffnet werden.
oneAlwaysStaysOne=Wertung 1 bleibt 1, unabhängig vom Spalten-Faktor
otherTieBreakingLeaderboard=Andere Rangliste zum Tie-Breaking
helptextLinkingRaces=Um unverknüpfte Wettfahrten mit getrackten Rennen zu verknüpfen, müssen sie in der untenstehenden Tabelle eine Wettfahrt linksklicken und danach das entsprechende getrackte Rennen in der rechten Ansicht linksklicken.
helptextLinkingRaces=Um unverknüpfte Wettfahrten mit getrackten Rennen zu verknüpfen, müssen sie in der untenstehenden Tabelle eine Wettfahrt linksklicken und danach das entsprechende getrackte Rennen in der rechten Ansicht linksklicken.
scoringSchemeLowPointA82Only=Low Point System; Tie-Break gemäß RRS A8.2 (Letztes Rennen)
scoringSchemeLowPointA82OnlyDescription=Low Point System; Tie-Break gemäß RRS A8.2; Falls ein Unentschieden nach dem Vergleich der Medal-Rennen verbleibt, vergleiche die Wertungen im letzten non-Medal Rennen, dann dem zweitletzten Rennen usw., bis ein Unterschied auftritt. Gestrichene Ergebnisse werden dabei ebenfalls berücksichtigt.
@@ -52,6 +52,8 @@ public class ScoringSchemeTypeFormatter {
return stringMessages.scoringSchemeLowPointSystemFirstThreeWins();
case HIGH_POINT_BY_WINS_TIES_LASTLY_BROKEN_BY_OTHER_LEADERBOARD:
return stringMessages.scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboard();
case LOW_POINT_A82_ONLY:
return stringMessages.scoringSchemeLowPointA82Only();
}
return null;
}
@@ -84,6 +86,8 @@ public class ScoringSchemeTypeFormatter {
return stringMessages.scoringSchemeLowPointSystemFirstThreeWinsDescription();
case HIGH_POINT_BY_WINS_TIES_LASTLY_BROKEN_BY_OTHER_LEADERBOARD:
return stringMessages.scoringSchemeHighPointsByWindTiesLastlyBrokenByOtherLeaderboardDescription();
case LOW_POINT_A82_ONLY:
return stringMessages.scoringSchemeLowPointA82OnlyDescription();
default:
return format(scoringSchemeType, stringMessages);
}
@@ -24,7 +24,7 @@
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console 12001 -clean"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=5010 -Xmx6000m -XX:ThreadPriorityPolicy=2 -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -Dpolardata.source.url=https://www.sapsailing.com -Dwindestimation.source.url=https://www.sapsailing.com -Drestore.tracked.races=true -Dorg.eclipse.jetty.server.Request.maxFormContentSize=50000000 -DAnniversaryRaceDeterminator.enabled=true -Djava.naming.factory.url.pkgs=org.eclipse.jetty.jndi -Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory -Dorg.eclipse.jetty.annotations.maxWait=120 -Dchargebee.site=sailytics-test -Dchargebee.apikey=test_G8QP4NUM1f4MCeZeni1VFC04cdIGZSNyp -Dsubscriptions.disableMailVerificationRequirement=true -Dgwt.rpc.version=9"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=5010 -Xmx6000m -XX:ThreadPriorityPolicy=2 -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -Dpolardata.source.url=https://www.sapsailing.com -Dwindestimation.source.url=https://www.sapsailing.com -Drestore.tracked.races=true -Dorg.eclipse.jetty.server.Request.maxFormContentSize=50000000 -DAnniversaryRaceDeterminator.enabled=true -Djava.naming.factory.url.pkgs=org.eclipse.jetty.jndi -Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory -Dorg.eclipse.jetty.annotations.maxWait=120 -Dchargebee.site=sailytics-test -Dchargebee.apikey=test_G8QP4NUM1f4MCeZeni1VFC04cdIGZSNyp -Dsubscriptions.disableMailVerificationRequirement=true -Dgwt.rpc.version=9"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="profilingTraceType-ALLOCATION_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%INCREASE_COUNT%CTX_KEY%8192%CTX_ENTRY%KEY_MIN_SIZE%CTX_KEY%32%CTX_ENTRY%KEY_MAX_SIZE%CTX_KEY%65536%CTX_ENTRY%KEY_INC_LINE_NRS%CTX_KEY%true%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%CLASS_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ADAPTIVE%CTX_KEY%false%CTX_ENTRY%"/>
@@ -23,9 +23,11 @@
<div class="mainContent">
<h2 class="releaseHeadline">Release Notes - Administration Console</h2>
<div class="innerContent">
<h2 class="articleSubheadline">March 2023</h2>
<h2 class="articleSubheadline">April 2023</h2>
<ul class="bulletList">
<li>Added boat classes "IMOCA", "VO65" and "VO60"</li>
<li>Implemented a new scoring scheme that ignores A8.1 tie-breaking and only uses A8.2 (last race,
second-to-last, etc.)</li>
</ul>
<h2 class="articleSubheadline">March 2023</h2>
<ul class="bulletList">
@@ -0,0 +1,42 @@
package com.sap.sse.common.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import org.junit.Test;
import com.sap.sse.common.Util;
public class UtilTest {
@Test
public void testFilterIterable() {
final Iterable<Integer> ints = Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5, 6);
assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), Util.asList(Util.filter(ints, i->i<7)));
}
@Test
public void testFilterLast() {
final Iterable<Integer> ints = Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5, 6);
assertEquals(Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5), Util.asList(Util.filter(ints, i->i!=6)));
}
@Test
public void testFilterFirst() {
final Iterable<Integer> ints = Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5, 6);
assertEquals(Arrays.asList(2, 3, 9, 8, 7, 4, 5, 6), Util.asList(Util.filter(ints, i->i!=1)));
}
@Test
public void testFilterNone() {
final Iterable<Integer> ints = Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5, 6);
assertEquals(ints, Util.asList(Util.filter(ints, i->true)));
}
@Test
public void testFilterAll() {
final Iterable<Integer> ints = Arrays.asList(1, 2, 3, 9, 8, 7, 4, 5, 6);
assertTrue(Util.isEmpty(Util.asList(Util.filter(ints, i->false))));
}
}
@@ -14,11 +14,11 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedSet;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
@@ -379,9 +379,39 @@ public class Util {
addAll(map(iterable, mapper), result);
return result;
}
@FunctionalInterface
public static interface UtilPredicate<T> {
boolean test(T t);
}
public static <T> Iterable<T> filter(final Iterable<T> iterable, final Predicate<T> predicate) {
return ()->StreamSupport.stream(iterable.spliterator(), /* parallel */ false).filter(predicate).iterator();
public static <T> Iterable<T> filter(final Iterable<T> iterable, final UtilPredicate<T> predicate) {
return ()->new Iterator<T>() {
private boolean hasNext = true;
private Iterator<T> iterator = iterable.iterator();
private T next = advance();
@Override
public boolean hasNext() {
return hasNext;
}
private T advance() {
while ((hasNext=iterator.hasNext()) && !predicate.test(next=iterator.next())) {
}
return next;
}
@Override
public T next() {
if (!hasNext) {
throw new NoSuchElementException();
}
final T result = next;
advance();
return result;
}
};
}
/**
+6
View File
@@ -60,6 +60,8 @@ The webserver is registered as target in various locations:
* as regular instance target in all load balancers' default rule's target group, such as ``DefDynsapsailing-com``, ``DNSMapped-0``, ``DNSMapped-1``, and so on; the names of the target groups are ``CentralWebServerHTTP-Dyn``, ``DDNSMapped-0-HTTP``, ``DDNSMapped-1-HTTP``, and so on, respectively.
* as target of the elastic IP address ``54.229.94.254``
Note that the elastic IP address ``54.229.94.254`` is in turn the target of the DNS record ``mail.sapsailing.com`` as well as the ``TXT`` DNS record for ``sapsailing.com`` for SPF e-mail validation.
Furthermore, it is helpful to ensure that the ``/internal-server-status`` path will resolve correctly to the Apache httpd server status page. For this, the ``/etc/httpd/conf.d/001-events.conf`` file contains three rules at the very beginning:
```
@@ -71,6 +73,10 @@ Use Status 127.0.0.1 internal-server-status
The second obviously requires maintenance as the internal IP changes, e.g., when instantiating a new Webserver copy by creating an image and restoring from the image. When upgrading / moving / copying the webserver you may try to be smart and copy the contents of ``/etc/ssh``, in particular the ``ssh_host_...`` files that contain the host keys. As you switch, users will then not have to upgrade their ``known_hosts`` file, and even internal accounts such as the Wiki account or the sailing accounts on other hosts that clone the git, or the build infrastructure won't be affected.
After (re-)booting the webserver, check that all services have come up before adding the instance to its respective target groups. For example, ensure that the Wiki "Gollum" service has been launched (see ``/home/wiki/serve.sh``). Furthermore, ensure that the Docker daemon is running and that it runs the Docker registry containers (``registry-ui-1`` and ``registry-registry-1``). See [here](https://wiki.sapsailing.com/wiki/info/landscape/docker-registry) for how this is set up.
The webserver must be tagged with key ``CentralReverseProxy`` where the value is ignored, but ``true`` is a good default.
### DNS and Application Load Balancers (ALBs)
We distinguish between DNS-mapped and non-DNS-mapped content. The basic services offered by the web server as listed above are DNS-mapped, with the DNS entries being CNAME records pointing to an ALB (DNSMapped-0-1286577811.eu-west-1.elb.amazonaws.com) which handles SSL offloading with the Amazon-managed certificate and forwards those requests to the web server. Furthermore, longer-running application replica sets can have a sub-domain declared in Route53's DNS, pointing to an ALB which then forwards to the public and master target groups for this replica set based on hostname, header fields and request method. A default redirect for the ``/`` path can also be defined, obsoleting previous Apache httpd reverse proxy redirects for non-archived ALB-mapped content.
+9
View File
@@ -98,7 +98,16 @@ To run a garbage collection in the registry, try this:
docker exec -it registry-registry-1 registry garbage-collect /etc/docker/registry/config.yml
```
This process is automated by adding the line
```
0 7 2 * * export PATH=/bin:/usr/bin:/usr/local/bin; docker exec -it registry-registry-1 registry garbage-collect /etc/docker/registry/config.yml
```
to /root/crontab and running ``crontab crontab`` as the ``root`` user. See also ``crontab -l`` for whether this has already been set up.
If you want to delete an entire repository, e.g., because you pushed images under an incorrect repository tag, try this:
```
docker exec -it registry-registry-1 rm -rf /var/lib/registry/docker/registry/v2/repositories/{your-repository-name}
```