Skip to content

Commit 22d5188

Browse files
committed
add deployment repo manager tests
1 parent 8f48416 commit 22d5188

File tree

9 files changed

+224
-14
lines changed

9 files changed

+224
-14
lines changed

internal/deployment-repo/deploymentRepoManager.go

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ type DeploymentRepoManager struct {
6464
gitConfig *gitconfig.Config
6565
// gitRepo is the cloned Git repository
6666
gitRepo *git.Repository
67+
68+
openMCPOperatorCV *ocmcli.ComponentVersion
6769
}
6870

6971
// NewDeploymentRepoManager creates a new DeploymentRepoManager with the specified parameters.
@@ -152,6 +154,15 @@ func (m *DeploymentRepoManager) Complete(ctx context.Context) (*DeploymentRepoMa
152154
return m, fmt.Errorf("failed to download templates resource: %w", err)
153155
}
154156

157+
logger.Infof("Fetching openmcp-operator component version")
158+
159+
m.openMCPOperatorCV, err = m.compGetter.GetReferencedComponentVersion(ctx, m.compGetter.RootComponentVersion(), openMCPOperatorComponentName)
160+
if err != nil {
161+
logger.Infof("No openmcp-operator component version found: %v", err)
162+
} else {
163+
logger.Infof("Found openmcp-operator component version: %s:%s", m.openMCPOperatorCV.Component.Name, m.openMCPOperatorCV.Component.Version)
164+
}
165+
155166
m.gitConfig, err = gitconfig.ParseConfig(m.GitConfigPath)
156167
if err != nil {
157168
return m, fmt.Errorf("failed to parse git config: %w", err)
@@ -192,26 +203,22 @@ func (m *DeploymentRepoManager) ApplyTemplates(ctx context.Context) error {
192203
logger := log.GetLogger()
193204

194205
logger.Infof("Applying templates from %s to deployment repository", m.TemplateResourceLocation)
195-
196206
templateInput := make(map[string]interface{})
197-
openMCPOperatorCV, err := m.compGetter.GetReferencedComponentVersion(ctx, m.compGetter.RootComponentVersion(), openMCPOperatorComponentName)
198207

199-
if err == nil {
200-
logger.Infof("Found openmcp-operator component version: %s:%s", openMCPOperatorCV.Component.Name, openMCPOperatorCV.Component.Version)
201-
202-
imageResources := openMCPOperatorCV.GetResourcesByType(ocmcli.OCIImageResourceType)
208+
if m.openMCPOperatorCV != nil {
209+
imageResources := m.openMCPOperatorCV.GetResourcesByType(ocmcli.OCIImageResourceType)
203210
if len(imageResources) == 0 || imageResources[0].Access.ImageReference == nil {
204-
return fmt.Errorf("no image resource found for openmcp-operator component version %s:%s", openMCPOperatorCV.Component.Name, openMCPOperatorCV.Component.Version)
211+
return fmt.Errorf("no image resource found for openmcp-operator component version %s:%s", m.openMCPOperatorCV.Component.Name, m.openMCPOperatorCV.Component.Version)
205212
}
206213

207214
templateInput["openmcpOperator"] = map[string]interface{}{
208-
"version": openMCPOperatorCV.Component.Version,
215+
"version": m.openMCPOperatorCV.Component.Version,
209216
"image": *imageResources[0].Access.ImageReference,
210217
"imagePullSecrets": m.ImagePullSecrets,
211218
}
212219
}
213220

214-
err = TemplateDir(m.templatesDir, templateInput, m.gitRepo)
221+
err := TemplateDir(m.templatesDir, templateInput, m.gitRepo)
215222
if err != nil {
216223
return fmt.Errorf("failed to apply templates from directory %s: %w", m.templatesDir, err)
217224
}
@@ -234,6 +241,43 @@ func (m *DeploymentRepoManager) ApplyProviders(ctx context.Context) error {
234241
return nil
235242
}
236243

244+
// ApplyCustomResourceDefinitions downloads and applies Custom Resource Definitions (CRDs) from the openmcp-operator component to the deployment repository.
245+
// If the openmcp-operator component is not found, it skips this step.
246+
func (m *DeploymentRepoManager) ApplyCustomResourceDefinitions(ctx context.Context) error {
247+
logger := log.GetLogger()
248+
249+
if m.openMCPOperatorCV == nil {
250+
logger.Infof("No openmcp-operator component version found, skipping CRD application")
251+
return nil
252+
}
253+
254+
logger.Infof("Applying Custom Resource Definitions to deployment repository")
255+
256+
crdsDownloadDir := filepath.Join(m.gitRepoDir, "crds")
257+
258+
err := os.Mkdir(crdsDownloadDir, 0o755)
259+
if err != nil {
260+
return fmt.Errorf("failed to create CRD download directory: %w", err)
261+
}
262+
263+
err = m.compGetter.DownloadDirectoryResource(ctx, m.openMCPOperatorCV, "openmcp-operator-crds", crdsDownloadDir)
264+
if err != nil {
265+
return fmt.Errorf("failed to download CRD resource: %w", err)
266+
}
267+
268+
workTree, err := m.gitRepo.Worktree()
269+
if err != nil {
270+
return fmt.Errorf("failed to get worktree: %w", err)
271+
}
272+
273+
_, err = workTree.Add("crds")
274+
if err != nil {
275+
return fmt.Errorf("failed to add CRD files: %w", err)
276+
}
277+
278+
return nil
279+
}
280+
237281
// CommitAndPushChanges commits all changes in the deployment repository and pushes them to the remote repository.
238282
// If there are no changes to commit, it does nothing.
239283
func (m *DeploymentRepoManager) CommitAndPushChanges(_ context.Context) error {
@@ -253,3 +297,7 @@ func (m *DeploymentRepoManager) CommitAndPushChanges(_ context.Context) error {
253297

254298
return nil
255299
}
300+
301+
func (m *DeploymentRepoManager) GitRepoDir() string {
302+
return m.gitRepoDir
303+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package deploymentrepo_test
2+
3+
import (
4+
"path/filepath"
5+
"testing"
6+
7+
"github.com/go-git/go-git/v5"
8+
"github.com/go-git/go-git/v5/plumbing"
9+
"github.com/stretchr/testify/assert"
10+
"sigs.k8s.io/yaml"
11+
12+
deploymentrepo "github.com/openmcp-project/bootstrapper/internal/deployment-repo"
13+
testutils "github.com/openmcp-project/bootstrapper/test/utils"
14+
)
15+
16+
func TestDeploymentRepoManager(t *testing.T) {
17+
testutils.DownloadOCMAndAddToPath(t)
18+
19+
ctfIn := testutils.BuildComponent("./testdata/01/component-constructor.yaml", t)
20+
21+
originDir := t.TempDir()
22+
23+
origin, err := git.PlainInit(originDir, false)
24+
assert.NoError(t, err)
25+
26+
originWorkTree, err := origin.Worktree()
27+
assert.NoError(t, err)
28+
assert.NotNil(t, originWorkTree)
29+
30+
dummyFilePath := filepath.Join(originDir, "dummy.txt")
31+
testutils.WriteToFile(t, dummyFilePath, "This is a dummy file.")
32+
testutils.AddFileToWorkTree(t, originWorkTree, "dummy.txt")
33+
testutils.WorkTreeCommit(t, originWorkTree, "Initial commit")
34+
35+
clusterProviders := []string{"test"}
36+
serviceProviders := []string{"test"}
37+
platformServices := []string{"test"}
38+
imagePullSecrets := []string{"imgpull-a", "imgpull-b"}
39+
40+
deploymentRepoManager, err := deploymentrepo.NewDeploymentRepoManager(
41+
ctfIn+"//github.com/openmcp-project/openmcp",
42+
"deployment-templates/templates",
43+
originDir,
44+
"incoming",
45+
"./testdata/01/git-config.yaml").
46+
WithClusterProviders(clusterProviders).
47+
WithServiceProviders(serviceProviders).
48+
WithPlatformServices(platformServices).
49+
WithImagePullSecrets(imagePullSecrets).
50+
Complete(t.Context())
51+
assert.NoError(t, err)
52+
assert.NotNil(t, deploymentRepoManager)
53+
54+
repo := deploymentRepoManager.GitRepoDir()
55+
56+
err = deploymentRepoManager.ApplyTemplates(t.Context())
57+
assert.NoError(t, err)
58+
59+
openMCPOperatorRaw := testutils.ReadFromFile(t, filepath.Join(repo, "openmcp-operator.yaml"))
60+
var openMCPOperator map[string]interface{}
61+
err = yaml.Unmarshal([]byte(openMCPOperatorRaw), &openMCPOperator)
62+
assert.NoError(t, err)
63+
assert.Contains(t, openMCPOperator, "openmcp-operator")
64+
root := openMCPOperator["openmcp-operator"].(map[string]interface{})
65+
assert.Contains(t, root, "version")
66+
assert.Equal(t, "v0.2.1", root["version"])
67+
assert.Contains(t, root, "image")
68+
assert.Equal(t, "ghcr.io/openmcp-project/images/openmcp-operator:v0.2.1", root["image"])
69+
assert.Contains(t, root, "imagePullSecrets")
70+
imagePullSecretsList := root["imagePullSecrets"].([]interface{})
71+
assert.Len(t, imagePullSecrets, 2)
72+
assert.Contains(t, imagePullSecretsList, map[string]interface{}{"name": "imgpull-a"})
73+
assert.Contains(t, imagePullSecretsList, map[string]interface{}{"name": "imgpull-b"})
74+
75+
err = deploymentRepoManager.ApplyProviders(t.Context())
76+
assert.NoError(t, err)
77+
78+
clusterProviderTestRaw := testutils.ReadFromFile(t, filepath.Join(repo, "cluster-providers", "test.yaml"))
79+
var clusterProviderTest map[string]interface{}
80+
err = yaml.Unmarshal([]byte(clusterProviderTestRaw), &clusterProviderTest)
81+
assert.NoError(t, err)
82+
ValidateProvider(t, clusterProviderTest, "test", "ghcr.io/openmcp-project/images/cluster-provider-test:v0.1.0", []string{"imgpull-a", "imgpull-b"})
83+
84+
serviceProviderTestRaw := testutils.ReadFromFile(t, filepath.Join(repo, "service-providers", "test.yaml"))
85+
var serviceProviderTest map[string]interface{}
86+
err = yaml.Unmarshal([]byte(serviceProviderTestRaw), &serviceProviderTest)
87+
assert.NoError(t, err)
88+
ValidateProvider(t, serviceProviderTest, "test", "ghcr.io/openmcp-project/images/service-provider-test:v0.2.0", []string{"imgpull-a", "imgpull-b"})
89+
90+
platformServiceTestRaw := testutils.ReadFromFile(t, filepath.Join(repo, "platform-services", "test.yaml"))
91+
var platformServiceTest map[string]interface{}
92+
err = yaml.Unmarshal([]byte(platformServiceTestRaw), &platformServiceTest)
93+
assert.NoError(t, err)
94+
ValidateProvider(t, platformServiceTest, "test", "ghcr.io/openmcp-project/images/platform-service-test:v0.3.0", []string{"imgpull-a", "imgpull-b"})
95+
96+
err = deploymentRepoManager.ApplyCustomResourceDefinitions(t.Context())
97+
assert.NoError(t, err)
98+
99+
crdRaw := testutils.ReadFromFile(t, filepath.Join(repo, "crds", "crd.yaml"))
100+
assert.NotEmpty(t, crdRaw)
101+
102+
err = deploymentRepoManager.CommitAndPushChanges(t.Context())
103+
assert.NoError(t, err)
104+
105+
err = originWorkTree.Checkout(&git.CheckoutOptions{Branch: plumbing.NewBranchReferenceName("incoming")})
106+
assert.NoError(t, err)
107+
108+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "dummy.txt"))
109+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "openmcp-operator.yaml"))
110+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "cluster-providers", "test.yaml"))
111+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "service-providers", "test.yaml"))
112+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "platform-services", "test.yaml"))
113+
_ = testutils.ReadFromFile(t, filepath.Join(originDir, "crds", "crd.yaml"))
114+
}

internal/deployment-repo/templater_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,22 @@ func TestTemplateProviders(t *testing.T) {
7070
var clusterProviderTest map[string]interface{}
7171
err = yaml.Unmarshal([]byte(clusterProviderTestRaw), &clusterProviderTest)
7272
assert.NoError(t, err)
73-
validateProvider(t, clusterProviderTest, "test", "ghcr.io/openmcp-project/images/cluster-provider-test:v0.1.0", []string{"imgpull-a", "imgpull-b"})
73+
ValidateProvider(t, clusterProviderTest, "test", "ghcr.io/openmcp-project/images/cluster-provider-test:v0.1.0", []string{"imgpull-a", "imgpull-b"})
7474

7575
serviceProviderTestRaw := testutils.ReadFromFile(t, filepath.Join(repoDir, "service-providers", "test.yaml"))
7676
var serviceProviderTest map[string]interface{}
7777
err = yaml.Unmarshal([]byte(serviceProviderTestRaw), &serviceProviderTest)
7878
assert.NoError(t, err)
79-
validateProvider(t, serviceProviderTest, "test", "ghcr.io/openmcp-project/images/service-provider-test:v0.2.0", []string{"imgpull-a", "imgpull-b"})
79+
ValidateProvider(t, serviceProviderTest, "test", "ghcr.io/openmcp-project/images/service-provider-test:v0.2.0", []string{"imgpull-a", "imgpull-b"})
8080

8181
platformServiceTestRaw := testutils.ReadFromFile(t, filepath.Join(repoDir, "platform-services", "test.yaml"))
8282
var platformServiceTest map[string]interface{}
8383
err = yaml.Unmarshal([]byte(platformServiceTestRaw), &platformServiceTest)
8484
assert.NoError(t, err)
85-
validateProvider(t, platformServiceTest, "test", "ghcr.io/openmcp-project/images/platform-service-test:v0.3.0", []string{"imgpull-a", "imgpull-b"})
85+
ValidateProvider(t, platformServiceTest, "test", "ghcr.io/openmcp-project/images/platform-service-test:v0.3.0", []string{"imgpull-a", "imgpull-b"})
8686
}
8787

88-
func validateProvider(t *testing.T, provider map[string]interface{}, name, image string, imagePullSecrets []string) {
88+
func ValidateProvider(t *testing.T, provider map[string]interface{}, name, image string, imagePullSecrets []string) {
8989
assert.Contains(t, provider, "metadata")
9090
assert.Contains(t, provider["metadata"], "name")
9191
assert.Equal(t, name, provider["metadata"].(map[string]interface{})["name"])

internal/deployment-repo/testdata/01/component-constructor.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ components:
55
name: openmcp-project
66

77
componentReferences:
8+
- componentName: github.com/openmcp-project/openmcp-operator
9+
name: openmcp-operator
10+
version: v0.2.1
11+
812
- componentName: github.com/openmcp-project/cluster-provider-test
913
name: cluster-provider-test
1014
version: v0.1.0
@@ -21,6 +25,26 @@ components:
2125
name: deployment-templates
2226
version: v0.1.1
2327

28+
- name: github.com/openmcp-project/openmcp-operator
29+
version: v0.2.1
30+
provider:
31+
name: openmcp-project
32+
33+
resources:
34+
- name: openmcp-operator-image
35+
type: ociImage
36+
version: v0.2.0
37+
access:
38+
type: ociArtifact
39+
imageReference: ghcr.io/openmcp-project/images/openmcp-operator:v0.2.1
40+
41+
- name: openmcp-operator-crds
42+
type: fileSystem
43+
version: v0.1.1
44+
input:
45+
type: dir
46+
path: ./crds
47+
2448
- name: github.com/openmcp-project/cluster-provider-test
2549
version: v0.1.0
2650
provider:
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
apiVersion: apiextensions.k8s.io/v1
2+
kind: CustomResourceDefinition
3+
metadata:
4+
name: test
5+
spec: {}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
auth:
2+
basic:
3+
username: user
4+
password: pass
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{{- if dig "openmcpOperator" "" .values }}
2+
openmcp-operator:
3+
version: {{ .values.openmcpOperator.version }}
4+
image: {{ .values.openmcpOperator.image }}
5+
{{- if dig "openmcpOperator" "imagePullSecrets" "" .values }}
6+
imagePullSecrets:
7+
{{- range $index, $value := .values.openmcpOperator.imagePullSecrets }}
8+
- name: "{{ $value }}"
9+
{{- end }}
10+
{{- end }}
11+
{{- end }}

internal/deployment-repo/testdata/01/templates/root.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/ocm-cli/component_getter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ func (g *ComponentGetter) DownloadTemplatesResource(ctx context.Context, downloa
9696
return downloadDirectoryResource(ctx, g.templatesComponentLocation, g.templatesResourceName, downloadDir, g.ocmConfig)
9797
}
9898

99+
func (g *ComponentGetter) DownloadDirectoryResource(ctx context.Context, cv *ComponentVersion, resourceName string, downloadDir string) error {
100+
componentLocation := buildLocation(g.repo, cv.Component.Name, cv.Component.Version)
101+
return downloadDirectoryResource(ctx, componentLocation, resourceName, downloadDir, g.ocmConfig)
102+
}
103+
99104
func downloadDirectoryResource(ctx context.Context, componentLocation string, resourceName string, downloadDir string, ocmConfig string) error {
100105
return Execute(ctx,
101106
[]string{"download", "resources", componentLocation, resourceName},

0 commit comments

Comments
 (0)