Skip to content

Commit df75d0f

Browse files
committed
update
1 parent 7023d6c commit df75d0f

File tree

4 files changed

+164
-88
lines changed

4 files changed

+164
-88
lines changed

cmd/manageDeploymentRepo.go

Lines changed: 63 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package cmd
22

33
import (
44
"fmt"
5+
"os"
6+
"path/filepath"
57

68
"github.com/go-git/go-git/v5"
79
deploymentrepo "github.com/openmcp-project/bootstrapper/internal/deployment-repo"
@@ -36,69 +38,99 @@ var manageDeploymentRepoCmd = &cobra.Command{
3638
Short: "Updates the openMCP deployment specification in the specified Git repository",
3739
Long: `Updates the openMCP deployment specification in the specified Git repository.
3840
The update is based on the specified component version.
39-
openmcp-bootstrapper manageDeploymentRepo <componentLocation> <templateDirectory> <deploymentRepository> <deploymentRepositoryBranch>`,
41+
openmcp-bootstrapper manageDeploymentRepo <componentLocation> <templateResourceLocation> <deploymentRepository> <deploymentRepositoryBranch>`,
4042
Args: cobra.ExactArgs(4),
4143
ArgAliases: []string{
4244
"componentLocation",
43-
"templateDirectory",
45+
"templateResourceLocation",
4446
"deploymentRepository",
4547
"deploymentRepositoryBranch",
4648
},
47-
Example: ` openmcp-bootstrapper manageDeploymentRepo "ghcr.io/openmcp-project/components//github.com/openmcp-project/openmcp:${OPENMCP_VERSION}" ./templates "https://github.com/${GITHUB_USER}/deployment-repo.git" incoming-branch`,
49+
Example: ` openmcp-bootstrapper manageDeploymentRepo "ghcr.io/openmcp-project/components//github.com/openmcp-project/openmcp:${OPENMCP_VERSION}" templates "https://github.com/${GITHUB_USER}/deployment-repo.git" incoming-branch`,
4850
RunE: func(cmd *cobra.Command, args []string) error {
4951
componentLocation := args[0]
50-
templateDirectory := args[1]
52+
templateResourceLocation := args[1]
5153
deploymentRepository := args[2]
5254
deploymentRepositoryBranch := args[3]
5355

54-
cv, err := ocmcli.GetComponentVersion(cmd.Context(), componentLocation, cmd.Flag(FlagOcmConfig).Value.String())
56+
logger := log.GetLogger()
57+
58+
tempDir, err := util.CreateTempDir("openmcp-bootstrapper-")
59+
logger.Tracef("Created temp dir: %s", tempDir)
5560
if err != nil {
56-
return fmt.Errorf("failed to get component version from %s: %w", componentLocation, err)
61+
return fmt.Errorf("failed to create temporary directory for deployment repository: %w", err)
62+
}
63+
defer func() {
64+
if err := util.DeleteTempDir(tempDir); err != nil {
65+
logger.Errorf("failed to delete temporary directory %s: %v", tempDir, err)
66+
}
67+
}()
68+
69+
templateDir := filepath.Join(tempDir, "templates")
70+
logger.Tracef("Created template dir: %s", templateDir)
71+
err = os.Mkdir(templateDir, 0o755)
72+
if err != nil {
73+
return fmt.Errorf("failed to create template directory: %w", err)
74+
}
75+
76+
logger.Infof("Downloading component %s", componentLocation)
77+
78+
ocmGetter := ocmcli.NewComponentGetter(componentLocation, templateResourceLocation, cmd.Flag(FlagOcmConfig).Value.String())
79+
err = ocmGetter.InitializeComponents(cmd.Context())
80+
if err != nil {
81+
return fmt.Errorf("failed to initialize components: %w", err)
82+
}
83+
84+
logger.Infof("Downloading templates resource %s", templateResourceLocation)
85+
86+
err = ocmGetter.DownloadTemplatesResource(cmd.Context(), templateDir)
87+
if err != nil {
88+
return fmt.Errorf("failed to download templates resource: %w", err)
5789
}
5890

59-
logger := log.GetLogger()
6091
logger.Debug("parsing git config file from flag:", cmd.Flag(FlagGitConfig).Value.String())
6192

93+
gitDir := filepath.Join(tempDir, "repo")
94+
err = os.Mkdir(gitDir, 0o755)
95+
if err != nil {
96+
return fmt.Errorf("failed to create git directory: %w", err)
97+
}
98+
6299
gitConfig, err := gitconfig.ParseConfig(cmd.Flag(FlagGitConfig).Value.String())
63100
if err != nil {
64-
return err
101+
return fmt.Errorf("failed to parse git config: %w", err)
65102
}
66103
if err := gitConfig.Validate(); err != nil {
67-
return err
104+
return fmt.Errorf("invalid git config: %w", err)
68105
}
69106

70107
cloneOptions := &git.CloneOptions{
71108
URL: deploymentRepository,
72109
Progress: LogWriter{},
73110
}
74111
if err := gitConfig.ConfigureCloneOptions(cloneOptions); err != nil {
75-
return err
112+
return fmt.Errorf("failed to configure git clone options: %w", err)
76113
}
77114

78-
tempDir, err := util.CreateTempDir("deployment-repo-")
79-
logger.Tracef("Created temp dir: %s", tempDir)
80-
if err != nil {
81-
return fmt.Errorf("failed to create temporary directory for deployment repository: %w", err)
82-
}
83-
defer func() {
84-
if err := util.DeleteTempDir(tempDir); err != nil {
85-
logger.Errorf("failed to delete temporary directory %s: %v", tempDir, err)
86-
}
87-
}()
115+
logger.Infof("Cloning deployment repository %s", deploymentRepository)
88116

89-
repo, err := deploymentrepo.CloneRepo(deploymentRepository, tempDir, gitConfig)
117+
repo, err := deploymentrepo.CloneRepo(deploymentRepository, gitDir, gitConfig)
90118
if err != nil {
91119
return fmt.Errorf("failed to clone deployment repository: %w", err)
92120
}
93121

122+
logger.Infof("Checking out or creating branch %s", deploymentRepositoryBranch)
123+
94124
err = deploymentrepo.CheckoutAndCreateBranchIfNotExists(repo, deploymentRepositoryBranch, gitConfig)
95125
if err != nil {
96126
return fmt.Errorf("failed to checkout or create branch %s: %w", deploymentRepositoryBranch, err)
97127
}
98128

99-
err = deploymentrepo.TemplateDir(templateDirectory, repo)
129+
logger.Infof("Applying templates from %s to deployment repository", templateResourceLocation)
130+
131+
err = deploymentrepo.TemplateDir(templateDir, repo)
100132
if err != nil {
101-
return fmt.Errorf("failed to apply templates from directory %s: %w", templateDirectory, err)
133+
return fmt.Errorf("failed to apply templates from directory %s: %w", templateDir, err)
102134
}
103135

104136
imagePullSecrets, err := cmd.Flags().GetStringArray(FlagImagePullSecret)
@@ -111,73 +143,25 @@ openmcp-bootstrapper manageDeploymentRepo <componentLocation> <templateDirectory
111143
return fmt.Errorf("failed to get cluster providers flag: %w", err)
112144
}
113145

114-
for _, provider := range clusterProviders {
115-
cr, err := cv.GetComponentReference("cluster-provider-" + provider)
116-
if err != nil {
117-
return fmt.Errorf("failed to get component reference for cluster provider %s: %w", provider, err)
118-
}
119-
120-
providerCV, err := ocmcli.GetComponentVersion(cmd.Context(), cv.Repository+"//"+cr.ComponentName, cmd.Flag(FlagOcmConfig).Value.String())
121-
if err != nil {
122-
return fmt.Errorf("failed to get component version for cluster provider %s: %w", provider, err)
123-
}
124-
125-
var imageResource *ocmcli.Resource
126-
127-
for _, resource := range providerCV.Component.Resources {
128-
if resource.Type == "ociImage" {
129-
imageResource = &resource
130-
break
131-
}
132-
}
133-
134-
if imageResource == nil || imageResource.Access.ImageReference == nil {
135-
return fmt.Errorf("image resource not found for cluster provider %s", provider)
136-
}
137-
138-
opts := &deploymentrepo.ProviderOptions{
139-
Name: provider,
140-
Image: *imageResource.Access.ImageReference, // This should be replaced with the actual image location
141-
ImagePullSecrets: imagePullSecrets,
142-
}
143-
err = deploymentrepo.TemplateClusterProvider(opts, repo)
144-
if err != nil {
145-
return fmt.Errorf("failed to apply cluster provider %s: %w", provider, err)
146-
}
147-
}
148-
149146
serviceProviders, err := cmd.Flags().GetStringArray(FlagServiceProvider)
150147
if err != nil {
151148
return fmt.Errorf("failed to get service providers flag: %w", err)
152149
}
153-
for _, provider := range serviceProviders {
154-
opts := &deploymentrepo.ProviderOptions{
155-
Name: provider,
156-
Image: "foo:1.2.3", // This should be replaced with the actual image location
157-
ImagePullSecrets: imagePullSecrets,
158-
}
159-
err = deploymentrepo.TemplateServiceProvider(opts, repo)
160-
if err != nil {
161-
return fmt.Errorf("failed to apply service provider %s: %w", provider, err)
162-
}
163-
}
164150

165151
platformServices, err := cmd.Flags().GetStringArray(FlagPlatformService)
166152
if err != nil {
167153
return fmt.Errorf("failed to get platform services flag: %w", err)
168154
}
169-
for _, service := range platformServices {
170-
opts := &deploymentrepo.ProviderOptions{
171-
Name: service,
172-
Image: "foo:1.2.3", // This should be replaced with the actual image location
173-
ImagePullSecrets: imagePullSecrets,
174-
}
175-
err = deploymentrepo.TemplatePlatformService(opts, repo)
176-
if err != nil {
177-
return fmt.Errorf("failed to apply platform service %s: %w", service, err)
178-
}
155+
156+
logger.Infof("Templating providers: clusterProviders=%v, serviceProviders=%v, platformServices=%v, imagePullSecrets=%v", clusterProviders, serviceProviders, platformServices, imagePullSecrets)
157+
158+
err = deploymentrepo.TemplateProviders(cmd.Context(), clusterProviders, serviceProviders, platformServices, imagePullSecrets, ocmGetter, repo)
159+
if err != nil {
160+
return fmt.Errorf("failed to template providers: %w", err)
179161
}
180162

163+
logger.Info("Committing and pushing changes to deployment repository")
164+
181165
err = deploymentrepo.CommitChanges(repo, "apply templates", "openmcp", "[email protected]")
182166
if err != nil {
183167
return fmt.Errorf("failed to commit changes: %w", err)

internal/deployment-repo/repo.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ func PushRepo(repo *git.Repository, branch string, gitConfig *gitconfig.Config)
6666
}
6767

6868
if err := repo.Push(pushOptions); err != nil {
69-
if !errors.Is(err, git.NoErrAlreadyUpToDate) {
69+
if errors.Is(err, git.NoErrAlreadyUpToDate) {
70+
logger.Info("No changes to push")
71+
} else {
7072
return fmt.Errorf("failed to push changes: %w", err)
7173
}
7274
}
@@ -93,7 +95,9 @@ func CommitChanges(repo *git.Repository, message, name, email string) error {
9395
},
9496
})
9597
if err != nil {
96-
if !errors.Is(err, git.ErrEmptyCommit) {
98+
if errors.Is(err, git.ErrEmptyCommit) {
99+
logger.Info("No changes to commit")
100+
} else {
97101
return fmt.Errorf("failed to commit changes: %w", err)
98102
}
99103
}

internal/deployment-repo/templater.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package deploymentrepo
22

33
import (
4+
"context"
45
_ "embed"
56
"fmt"
67
"os"
@@ -9,6 +10,7 @@ import (
910
"github.com/go-git/go-billy/v5"
1011
"github.com/go-git/go-git/v5"
1112
"github.com/openmcp-project/bootstrapper/internal/log"
13+
ocmcli "github.com/openmcp-project/bootstrapper/internal/ocm-cli"
1214
"github.com/openmcp-project/bootstrapper/internal/template"
1315
)
1416

@@ -112,6 +114,88 @@ type ProviderOptions struct {
112114
ImagePullSecrets []string
113115
}
114116

117+
func TemplateProviders(ctx context.Context, clusterProviders, serviceProviders, platformServices, imagePullSecrets []string, ocmGetter *ocmcli.ComponentGetter, repo *git.Repository) error {
118+
for _, cp := range clusterProviders {
119+
componentVersion, err := ocmGetter.GetReferencedComponentVersion(ctx, "cluster-provider-"+cp)
120+
if err != nil {
121+
return fmt.Errorf("failed to get component version for cluster provider %s: %w", cp, err)
122+
}
123+
124+
imageResource, err := getImageResource(componentVersion)
125+
if err != nil {
126+
return fmt.Errorf("failed to get image resource for cluster provider %s: %w", cp, err)
127+
}
128+
129+
opts := &ProviderOptions{
130+
Name: cp,
131+
Image: *imageResource.Access.ImageReference,
132+
ImagePullSecrets: imagePullSecrets,
133+
}
134+
135+
err = TemplateClusterProvider(opts, repo)
136+
if err != nil {
137+
return fmt.Errorf("failed to apply cluster provider %s: %w", cp, err)
138+
}
139+
}
140+
141+
for _, sp := range serviceProviders {
142+
componentVersion, err := ocmGetter.GetReferencedComponentVersion(ctx, "service-provider-"+sp)
143+
if err != nil {
144+
return fmt.Errorf("failed to get component version for service provider %s: %w", sp, err)
145+
}
146+
147+
imageResource, err := getImageResource(componentVersion)
148+
if err != nil {
149+
return fmt.Errorf("failed to get image resource for service provider %s: %w", sp, err)
150+
}
151+
152+
opts := &ProviderOptions{
153+
Name: sp,
154+
Image: *imageResource.Access.ImageReference,
155+
ImagePullSecrets: imagePullSecrets,
156+
}
157+
158+
err = TemplateServiceProvider(opts, repo)
159+
if err != nil {
160+
return fmt.Errorf("failed to apply service provider %s: %w", sp, err)
161+
}
162+
}
163+
164+
for _, ps := range platformServices {
165+
componentVersion, err := ocmGetter.GetReferencedComponentVersion(ctx, "platform-service-"+ps)
166+
if err != nil {
167+
return fmt.Errorf("failed to get component version for platform service %s: %w", ps, err)
168+
}
169+
170+
imageResource, err := getImageResource(componentVersion)
171+
if err != nil {
172+
return fmt.Errorf("failed to get image resource for platform service %s: %w", ps, err)
173+
}
174+
175+
opts := &ProviderOptions{
176+
Name: ps,
177+
Image: *imageResource.Access.ImageReference,
178+
ImagePullSecrets: imagePullSecrets,
179+
}
180+
181+
err = TemplatePlatformService(opts, repo)
182+
if err != nil {
183+
return fmt.Errorf("failed to apply platform service %s: %w", ps, err)
184+
}
185+
}
186+
187+
return nil
188+
}
189+
190+
func getImageResource(cv *ocmcli.ComponentVersion) (*ocmcli.Resource, error) {
191+
for _, resource := range cv.Component.Resources {
192+
if resource.Type == "ociImage" {
193+
return &resource, nil
194+
}
195+
}
196+
return nil, fmt.Errorf("image resource not found for component %s", cv.Component.Name)
197+
}
198+
115199
func TemplateClusterProvider(options *ProviderOptions, repo *git.Repository) error {
116200
return templateProvider(options, clusterProviderTemplate, "cluster-providers", repo)
117201
}

internal/ocm-cli/component_getter.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ type ComponentGetter struct {
1414
ocmConfig string
1515

1616
// Fields derived during InitializeComponents
17+
repo string
18+
1719
rootComponentVersion *ComponentVersion
1820
templatesComponentVersion *ComponentVersion
1921
templatesComponentLocation string
@@ -29,7 +31,9 @@ func NewComponentGetter(rootComponentLocation, deploymentTemplates, ocmConfig st
2931
}
3032

3133
func (g *ComponentGetter) InitializeComponents(ctx context.Context) error {
32-
repo, err := extractRepoFromLocation(g.rootComponentLocation)
34+
var err error
35+
36+
g.repo, err = extractRepoFromLocation(g.rootComponentLocation)
3337
if err != nil {
3438
return err
3539
}
@@ -50,14 +54,14 @@ func (g *ComponentGetter) InitializeComponents(ctx context.Context) error {
5054

5155
cv := g.rootComponentVersion
5256
for _, refName := range referenceNames {
53-
cv, err = getReferencedComponentVersion(ctx, repo, cv, refName, g.ocmConfig)
57+
cv, err = g.GetReferencedComponentVersion(ctx, refName)
5458
if err != nil {
5559
return fmt.Errorf("error getting referenced component version %s: %w", refName, err)
5660
}
5761
}
5862

5963
g.templatesComponentVersion = cv
60-
g.templatesComponentLocation = buildLocation(repo, cv.Component.Name, cv.Component.Version)
64+
g.templatesComponentLocation = buildLocation(g.repo, cv.Component.Name, cv.Component.Version)
6165
return nil
6266
}
6367

@@ -73,14 +77,14 @@ func (g *ComponentGetter) TemplatesResourceName() string {
7377
return g.templatesResourceName
7478
}
7579

76-
func getReferencedComponentVersion(ctx context.Context, repo string, parentCV *ComponentVersion, refName string, ocmConfig string) (*ComponentVersion, error) {
77-
ref, err := parentCV.GetComponentReference(refName)
80+
func (g *ComponentGetter) GetReferencedComponentVersion(ctx context.Context, refName string) (*ComponentVersion, error) {
81+
ref, err := g.rootComponentVersion.GetComponentReference(refName)
7882
if err != nil {
7983
return nil, fmt.Errorf("error getting component reference %s: %w", refName, err)
8084
}
8185

82-
location := buildLocation(repo, ref.ComponentName, ref.Version)
83-
cv, err := GetComponentVersion(ctx, location, ocmConfig)
86+
location := buildLocation(g.repo, ref.ComponentName, ref.Version)
87+
cv, err := GetComponentVersion(ctx, location, g.ocmConfig)
8488
if err != nil {
8589
return nil, fmt.Errorf("error getting component version %s: %w", location, err)
8690
}

0 commit comments

Comments
 (0)