Skip to content

Commit 5f38153

Browse files
authored
Serverless products should not allow versioning (#2920)
* Serverless products should not allow versioning * Fix test and improve error message * Remove versions from serverless applicability declarations
1 parent df0430d commit 5f38153

5 files changed

Lines changed: 138 additions & 62 deletions

File tree

docs/syntax/applies.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ apm_agent_java: beta 1.0+
314314
edot_dotnet: preview 1.0+
315315
edot_python:
316316
edot_node: ga 1.0+
317-
elasticsearch: preview 9.0+
318-
security: removed 9.0
319-
observability: deprecated 9.0+
317+
elasticsearch: preview
318+
security: removed
319+
observability: deprecated
320320
```
321321

322322
### In-text example

src/Elastic.Documentation/AppliesTo/ApplicableToYamlConverter.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ private static void AssignDeploymentType(Dictionary<object, object?> dictionary,
150150
applicableTo.Deployment = DeploymentApplicability.All;
151151
else if (deploymentType is string deploymentTypeString)
152152
{
153-
var av = AppliesCollection.TryParse(deploymentTypeString, diagnostics, out var a) ? a : null;
153+
var applies = AppliesCollection.TryParse(deploymentTypeString, diagnostics, out var a) ? a : null;
154+
if (applies is not null)
155+
ValidateApplicabilityCollection("ess", applies, diagnostics);
154156
applicableTo.Deployment = new DeploymentApplicability
155157
{
156-
Ece = av,
157-
Eck = av,
158-
Ess = av,
159-
Self = av
158+
Ece = applies,
159+
Eck = applies,
160+
Ess = applies,
161+
Self = applies
160162
};
161163
}
162164
else if (deploymentType is Dictionary<object, object?> deploymentDictionary)
@@ -193,12 +195,14 @@ private static void AssignServerless(Dictionary<object, object?> dictionary, App
193195
applicableTo.Serverless = ServerlessProjectApplicability.All;
194196
else if (serverless is string serverlessString)
195197
{
196-
var av = AppliesCollection.TryParse(serverlessString, diagnostics, out var a) ? a : null;
198+
var applies = AppliesCollection.TryParse(serverlessString, diagnostics, out var a) ? a : null;
199+
if (applies is not null)
200+
ValidateApplicabilityCollection("serverless", applies, diagnostics);
197201
applicableTo.Serverless = new ServerlessProjectApplicability
198202
{
199-
Elasticsearch = av,
200-
Observability = av,
201-
Security = av
203+
Elasticsearch = applies,
204+
Observability = applies,
205+
Security = applies
202206
};
203207
}
204208
else if (serverless is Dictionary<object, object?> serverlessDictionary)
@@ -322,6 +326,9 @@ private static bool TryGetProductApplicability(Dictionary<object, object?> dicti
322326
return true;
323327
}
324328

329+
private static readonly HashSet<string> VersionlessKeys =
330+
["ess", "ech", "serverless", "elasticsearch", "observability", "security"];
331+
325332
private static bool TryGetApplicabilityOverTime(Dictionary<object, object?> dictionary, string key, List<(Severity, string)> diagnostics,
326333
out AppliesCollection? availability)
327334
{
@@ -345,6 +352,15 @@ private static void ValidateApplicabilityCollection(string key, AppliesCollectio
345352
{
346353
var items = collection.ToList();
347354

355+
// Rule: Versionless products cannot have version specifications
356+
if (VersionlessKeys.Contains(key))
357+
{
358+
if (items.Any(a => a.Version is not null && a.Version != AllVersionsSpec.Instance))
359+
diagnostics.Add((Severity.Error,
360+
$"Can't specify a version for '{key}' because this product is not versioned. Remove the version, or use 'stack:' for version-specific requirements."));
361+
return;
362+
}
363+
348364
// Rule: Only one version declaration per lifecycle
349365
var lifecycleGroups = items.GroupBy(a => a.Lifecycle).ToList();
350366
var lifecyclesWithMultipleVersions = lifecycleGroups

tests/authoring/Applicability/AppliesToDirective.fs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ type ``piggy back off yaml formatting`` () =
1515
static let markdown = Setup.Markdown """
1616
```yaml {applies_to}
1717
serverless:
18-
security: ga 9.0.0
19-
elasticsearch: beta 9.1.0
20-
observability: removed 9.2.0
18+
security: ga
19+
elasticsearch: beta
20+
observability: removed
2121
```
2222
"""
2323

@@ -28,19 +28,19 @@ serverless:
2828

2929
directives |> appliesToDirective (ApplicableTo(
3030
Serverless=ServerlessProjectApplicability(
31-
Security=AppliesCollection.op_Explicit "ga 9.0.0",
32-
Elasticsearch=AppliesCollection.op_Explicit "beta 9.1.0",
33-
Observability=AppliesCollection.op_Explicit "removed 9.2.0"
31+
Security=AppliesCollection.op_Explicit "ga",
32+
Elasticsearch=AppliesCollection.op_Explicit "beta",
33+
Observability=AppliesCollection.op_Explicit "removed"
3434
)
3535
))
3636

3737
type ``plain block`` () =
3838
static let markdown = Setup.Markdown """
3939
```{applies_to}
4040
serverless:
41-
security: ga 9.0.0
42-
elasticsearch: beta 9.1.0
43-
observability: removed 9.2.0
41+
security: ga
42+
elasticsearch: beta
43+
observability: removed
4444
apm_agent_dotnet: ga 9.0
4545
apm_agent_node: ga 10.0
4646
```
@@ -53,9 +53,9 @@ apm_agent_node: ga 10.0
5353

5454
directives |> appliesToDirective (ApplicableTo(
5555
Serverless=ServerlessProjectApplicability(
56-
Security=AppliesCollection.op_Explicit "ga 9.0.0",
57-
Elasticsearch=AppliesCollection.op_Explicit "beta 9.1.0",
58-
Observability=AppliesCollection.op_Explicit "removed 9.2.0"
56+
Security=AppliesCollection.op_Explicit "ga",
57+
Elasticsearch=AppliesCollection.op_Explicit "beta",
58+
Observability=AppliesCollection.op_Explicit "removed"
5959
),
6060
ProductApplicability=ProductApplicability(
6161
ApmAgentDotnet=AppliesCollection.op_Explicit "ga 9.0",

0 commit comments

Comments
 (0)