17
17
# limitations under the License.
18
18
"""Renku service template create project controller."""
19
19
import shutil
20
- from pathlib import Path
21
- from typing import Dict , Optional
20
+ from typing import Any , Dict , Optional , cast
22
21
23
22
from marshmallow import EXCLUDE
24
23
25
24
from renku .command .init import create_from_template_local_command
25
+ from renku .core import errors
26
+ from renku .core .template .template import fetch_templates_source
26
27
from renku .core .util .contexts import renku_project_context
27
- from renku .domain_model .template import TEMPLATE_MANIFEST , TemplatesManifest
28
+ from renku .domain_model .template import Template
28
29
from renku .infrastructure .repository import Repository
29
30
from renku .ui .service .config import MESSAGE_PREFIX
30
31
from renku .ui .service .controllers .api .abstract import ServiceCtrl
31
32
from renku .ui .service .controllers .api .mixins import RenkuOperationMixin
32
- from renku .ui .service .controllers .utils .project_clone import user_project_clone
33
33
from renku .ui .service .errors import UserProjectCreationError
34
34
from renku .ui .service .serializers .templates import ProjectTemplateRequest , ProjectTemplateResponseRPC
35
35
from renku .ui .service .utils import new_repo_push
@@ -45,11 +45,14 @@ class TemplatesCreateProjectCtrl(ServiceCtrl, RenkuOperationMixin):
45
45
46
46
def __init__ (self , cache , user_data , request_data ):
47
47
"""Construct a templates read manifest controller."""
48
- self .ctx = TemplatesCreateProjectCtrl .REQUEST_SERIALIZER .load ({** user_data , ** request_data }, unknown = EXCLUDE )
48
+ self .ctx = cast (
49
+ Dict [str , Any ],
50
+ TemplatesCreateProjectCtrl .REQUEST_SERIALIZER .load ({** user_data , ** request_data }, unknown = EXCLUDE ),
51
+ )
49
52
self .ctx ["commit_message" ] = f"{ MESSAGE_PREFIX } init { self .ctx ['project_name' ]} "
50
53
super (TemplatesCreateProjectCtrl , self ).__init__ (cache , user_data , request_data )
51
54
52
- self .template : Optional [Dict ] = None
55
+ self .template : Optional [Template ] = None
53
56
54
57
@property
55
58
def context (self ):
@@ -59,16 +62,12 @@ def context(self):
59
62
@property
60
63
def default_metadata (self ):
61
64
"""Default metadata for project creation."""
62
- automated_update = True
63
- if self .template and "allow_template_update" in self .template :
64
- automated_update = self .template ["allow_template_update" ]
65
65
66
66
metadata = {
67
67
"__template_source__" : self .ctx ["git_url" ],
68
68
"__template_ref__" : self .ctx ["ref" ],
69
69
"__template_id__" : self .ctx ["identifier" ],
70
70
"__namespace__" : self .ctx ["project_namespace" ],
71
- "__automated_update__" : automated_update ,
72
71
"__repository__" : self .ctx ["project_repository" ],
73
72
"__sanitized_project_name__" : self .ctx ["project_name_stripped" ],
74
73
"__project_slug__" : self .ctx ["project_slug" ],
@@ -114,50 +113,49 @@ def setup_new_project(self):
114
113
115
114
def setup_template (self ):
116
115
"""Reads template manifest."""
117
- project = user_project_clone (self .user_data , self .ctx )
118
- templates = TemplatesManifest .from_path (Path (project .abs_path ) / TEMPLATE_MANIFEST ).get_raw_content ()
116
+ templates_source = fetch_templates_source (source = self .ctx ["git_url" ], reference = self .ctx ["ref" ])
119
117
identifier = self .ctx ["identifier" ]
120
- self .template = next ((template for template in templates if template ["folder" ] == identifier ), None )
121
- if self .template is None :
118
+ try :
119
+ self .template = templates_source .get_template (id = identifier , reference = None )
120
+ except (errors .InvalidTemplateError , errors .TemplateNotFoundError ) as e :
122
121
raise UserProjectCreationError (
123
122
error_message = f"the template '{ identifier } ' does not exist in the target template's repository"
124
- )
123
+ ) from e
125
124
126
- repository = Repository (project . abs_path )
125
+ repository = Repository (templates_source . path )
127
126
self .template_version = repository .head .commit .hexsha
128
127
129
128
# Verify missing parameters
130
- template_parameters = self .template .get ( "variables" , {} )
129
+ template_parameters = set ( p . name for p in self .template .parameters )
131
130
provided_parameters = {p ["key" ]: p ["value" ] for p in self .ctx ["parameters" ]}
132
- missing_keys = list (template_parameters . keys () - provided_parameters .keys ())
131
+ missing_keys = list (template_parameters - provided_parameters .keys ())
133
132
if len (missing_keys ) > 0 :
134
133
raise UserProjectCreationError (error_message = f"the template requires a value for '${ missing_keys [0 ]} '" )
135
134
136
- return project , provided_parameters
135
+ return provided_parameters
137
136
138
137
def new_project_push (self , project_path ):
139
138
"""Push new project to the remote."""
140
139
return new_repo_push (project_path , self .ctx ["new_project_url_with_auth" ])
141
140
142
141
def new_project (self ):
143
142
"""Create new project from template."""
144
- template_project , provided_parameters = self .setup_template ()
143
+ provided_parameters = self .setup_template ()
144
+ assert self .template is not None
145
145
new_project = self .setup_new_project ()
146
146
new_project_path = new_project .abs_path
147
147
148
- source_path = template_project .abs_path / self .ctx ["identifier" ]
149
-
150
148
with renku_project_context (new_project_path ):
151
149
create_from_template_local_command ().build ().execute (
152
- source_path ,
150
+ self . template . path ,
153
151
name = self .ctx ["project_name" ],
154
152
namespace = self .ctx ["project_namespace" ],
155
153
metadata = provided_parameters ,
156
154
default_metadata = self .default_metadata ,
157
155
custom_metadata = self .ctx ["project_custom_metadata" ],
158
156
template_version = self .template_version ,
159
- immutable_template_files = self .template .get ( "immutable_template_files" , []), # type: ignore[union-attr]
160
- automated_template_update = self .template .get ( "allow_template_update" , True ), # type: ignore[union-attr]
157
+ immutable_template_files = self .template .immutable_files ,
158
+ automated_template_update = self .template .allow_update ,
161
159
user = self .git_user ,
162
160
initial_branch = self .ctx ["initial_branch" ],
163
161
commit_message = self .ctx ["commit_message" ],
0 commit comments