@@ -2,6 +2,8 @@ package cmd
22
33import (
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.
3840The 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 )
0 commit comments