Skip to content

Commit 1ce805e

Browse files
authored
Set archetype format version to the latest available spec version (#1426)
Fill the spec version when creating packages with `elastic-package create package` using the latest available version in the Package Spec. Review related tests to don't depend on the current directory.
1 parent 79def21 commit 1ce805e

File tree

5 files changed

+58
-37
lines changed

5 files changed

+58
-37
lines changed

cmd/create_package.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"fmt"
99

1010
"github.com/AlecAivazis/survey/v2"
11-
1211
"github.com/spf13/cobra"
1312

1413
"github.com/elastic/elastic-package/internal/licenses"
@@ -174,6 +173,12 @@ func createPackageCommandAction(cmd *cobra.Command, args []string) error {
174173
}
175174

176175
descriptor := createPackageDescriptorFromAnswers(answers)
176+
specVersion, err := archetype.GetLatestStableSpecVersion()
177+
if err != nil {
178+
return fmt.Errorf("failed to get spec version: %w", err)
179+
}
180+
descriptor.Manifest.SpecVersion = specVersion.String()
181+
177182
err = archetype.CreatePackage(descriptor)
178183
if err != nil {
179184
return fmt.Errorf("can't create new package: %w", err)

internal/packages/archetype/_static/package-manifest.yml.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
format_version: 2.10.0
1+
format_version: {{.Manifest.SpecVersion}}
22
name: {{.Manifest.Name}}
33
title: "{{.Manifest.Title}}"
44
version: {{.Manifest.Version}}
@@ -71,4 +71,4 @@ policy_templates:
7171
{{ end }}
7272
{{ end -}}
7373
owner:
74-
github: {{.Manifest.Owner.Github}}
74+
github: {{.Manifest.Owner.Github}}

internal/packages/archetype/package.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,18 @@ type PackageDescriptor struct {
2424

2525
// CreatePackage function bootstraps the new package based on the provided descriptor.
2626
func CreatePackage(packageDescriptor PackageDescriptor) error {
27-
baseDir := packageDescriptor.Manifest.Name
27+
return createPackageInDir(packageDescriptor, ".")
28+
}
29+
30+
func createPackageInDir(packageDescriptor PackageDescriptor, cwd string) error {
31+
baseDir := filepath.Join(cwd, packageDescriptor.Manifest.Name)
2832
_, err := os.Stat(baseDir)
2933
if err == nil {
3034
return fmt.Errorf(`package "%s" already exists`, baseDir)
3135
}
3236

3337
logger.Debugf("Write package manifest")
34-
err = renderResourceFile(packageManifestTemplate, &packageDescriptor, filepath.Join(baseDir, "manifest.yml"))
38+
err = renderResourceFile(packageManifestTemplate, packageDescriptor, filepath.Join(baseDir, "manifest.yml"))
3539
if err != nil {
3640
return fmt.Errorf("can't render package manifest: %w", err)
3741
}

internal/packages/archetype/package_test.go

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package archetype
66

77
import (
88
"fmt"
9-
"os"
109
"path/filepath"
1110
"testing"
1211

@@ -39,23 +38,12 @@ func TestPackage(t *testing.T) {
3938
})
4039
}
4140

42-
func createAndCheckPackage(t require.TestingT, pd PackageDescriptor) error {
43-
wd, err := os.Getwd()
41+
func createAndCheckPackage(t *testing.T, pd PackageDescriptor) error {
42+
tempDir := t.TempDir()
43+
err := createPackageInDir(pd, tempDir)
4444
require.NoError(t, err)
4545

46-
tempDir, err := os.MkdirTemp("", "archetype-create-package-")
47-
require.NoError(t, err)
48-
49-
os.Chdir(tempDir)
50-
defer func() {
51-
os.Chdir(wd)
52-
os.RemoveAll(tempDir)
53-
}()
54-
55-
err = CreatePackage(pd)
56-
require.NoError(t, err)
57-
58-
err = checkPackage(pd.Manifest.Name)
46+
err = checkPackage(filepath.Join(tempDir, pd.Manifest.Name))
5947
return err
6048
}
6149

@@ -64,12 +52,17 @@ func createPackageDescriptorForTest(packageType, kibanaVersion string) PackageDe
6452
if packageType == "input" {
6553
inputDataStreamType = "logs"
6654
}
55+
specVersion, err := GetLatestStableSpecVersion()
56+
if err != nil {
57+
panic(err)
58+
}
6759
return PackageDescriptor{
6860
Manifest: packages.PackageManifest{
69-
Name: "go_unit_test_package",
70-
Title: "Go Unit Test Package",
71-
Type: packageType,
72-
Version: "1.2.3",
61+
SpecVersion: specVersion.String(),
62+
Name: "go_unit_test_package",
63+
Title: "Go Unit Test Package",
64+
Type: packageType,
65+
Version: "1.2.3",
7366
Conditions: packages.Conditions{
7467
Kibana: packages.KibanaConditions{
7568
Version: kibanaVersion,
@@ -82,24 +75,14 @@ func createPackageDescriptorForTest(packageType, kibanaVersion string) PackageDe
8275
Github: "mtojek",
8376
},
8477
Description: "This package has been generated by a Go unit test.",
85-
License: "basic",
8678
Categories: []string{"aws", "custom"},
8779
},
8880
InputDataStreamType: inputDataStreamType,
8981
}
9082
}
9183

92-
func checkPackage(packageName string) error {
93-
wd, err := os.Getwd()
94-
if err != nil {
95-
return fmt.Errorf("can't get working directory: %w", err)
96-
}
97-
packageRoot := filepath.Join(wd, packageName)
98-
99-
os.Chdir(packageRoot)
100-
defer os.Chdir(wd)
101-
102-
err = validator.ValidateFromPath(packageRoot)
84+
func checkPackage(packageRoot string) error {
85+
err := validator.ValidateFromPath(packageRoot)
10386
if err != nil {
10487
return fmt.Errorf("linting package failed: %w", err)
10588
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
2+
// or more contributor license agreements. Licensed under the Elastic License;
3+
// you may not use this file except in compliance with the Elastic License.
4+
5+
package archetype
6+
7+
import (
8+
"errors"
9+
"fmt"
10+
11+
"github.com/Masterminds/semver/v3"
12+
spec "github.com/elastic/package-spec/v2"
13+
)
14+
15+
func GetLatestStableSpecVersion() (semver.Version, error) {
16+
specVersions, err := spec.VersionsInChangelog()
17+
if err != nil {
18+
return semver.Version{}, fmt.Errorf("can't find existing spec versions: %w", err)
19+
}
20+
21+
// We assume versions are sorted here.
22+
for _, version := range specVersions {
23+
if version.Prerelease() == "" {
24+
return version, nil
25+
}
26+
}
27+
28+
return semver.Version{}, errors.New("no stable package spec version found, this is probably a bug")
29+
}

0 commit comments

Comments
 (0)