17
17
import org .opensearch .core .xcontent .ToXContent ;
18
18
import org .opensearch .core .xcontent .XContentBuilder ;
19
19
import org .opensearch .core .xcontent .XContentParser ;
20
+ import org .opensearch .flowframework .common .DefaultUseCases ;
20
21
import org .opensearch .flowframework .common .FlowFrameworkSettings ;
21
22
import org .opensearch .flowframework .exception .FlowFrameworkException ;
22
23
import org .opensearch .flowframework .model .Template ;
23
24
import org .opensearch .flowframework .transport .CreateWorkflowAction ;
24
25
import org .opensearch .flowframework .transport .WorkflowRequest ;
26
+ import org .opensearch .flowframework .util .ParseUtils ;
25
27
import org .opensearch .rest .BaseRestHandler ;
26
28
import org .opensearch .rest .BytesRestResponse ;
27
29
import org .opensearch .rest .RestRequest ;
28
30
29
31
import java .io .IOException ;
32
+ import java .util .Collections ;
30
33
import java .util .List ;
31
34
import java .util .Locale ;
32
35
import java .util .Map ;
35
38
36
39
import static org .opensearch .core .xcontent .XContentParserUtils .ensureExpectedToken ;
37
40
import static org .opensearch .flowframework .common .CommonValue .PROVISION_WORKFLOW ;
41
+ import static org .opensearch .flowframework .common .CommonValue .USE_CASE ;
38
42
import static org .opensearch .flowframework .common .CommonValue .VALIDATION ;
39
43
import static org .opensearch .flowframework .common .CommonValue .WORKFLOW_ID ;
40
44
import static org .opensearch .flowframework .common .CommonValue .WORKFLOW_URI ;
@@ -78,6 +82,7 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
78
82
String workflowId = request .param (WORKFLOW_ID );
79
83
String [] validation = request .paramAsStringArray (VALIDATION , new String [] { "all" });
80
84
boolean provision = request .paramAsBoolean (PROVISION_WORKFLOW , false );
85
+ String useCase = request .param (USE_CASE );
81
86
// If provisioning, consume all other params and pass to provision transport action
82
87
Map <String , String > params = provision
83
88
? request .params ()
@@ -112,11 +117,63 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
112
117
);
113
118
}
114
119
try {
115
- XContentParser parser = request .contentParser ();
116
- ensureExpectedToken (XContentParser .Token .START_OBJECT , parser .nextToken (), parser );
117
- Template template = Template .parse (parser );
118
120
119
- WorkflowRequest workflowRequest = new WorkflowRequest (workflowId , template , validation , provision , params );
121
+ Template template ;
122
+ Map <String , String > useCaseDefaultsMap = Collections .emptyMap ();
123
+ if (useCase != null ) {
124
+ String useCaseTemplateFileInStringFormat = ParseUtils .resourceToString (
125
+ "/" + DefaultUseCases .getSubstitutionReadyFileByUseCaseName (useCase )
126
+ );
127
+ String defaultsFilePath = DefaultUseCases .getDefaultsFileByUseCaseName (useCase );
128
+ useCaseDefaultsMap = ParseUtils .parseJsonFileToStringToStringMap ("/" + defaultsFilePath );
129
+
130
+ if (request .hasContent ()) {
131
+ try {
132
+ XContentParser parser = request .contentParser ();
133
+ ensureExpectedToken (XContentParser .Token .START_OBJECT , parser .nextToken (), parser );
134
+ Map <String , String > userDefaults = ParseUtils .parseStringToStringMap (parser );
135
+ // updates the default params with anything user has given that matches
136
+ for (Map .Entry <String , String > userDefaultsEntry : userDefaults .entrySet ()) {
137
+ String key = userDefaultsEntry .getKey ();
138
+ String value = userDefaultsEntry .getValue ();
139
+ if (useCaseDefaultsMap .containsKey (key )) {
140
+ useCaseDefaultsMap .put (key , value );
141
+ }
142
+ }
143
+ } catch (Exception ex ) {
144
+ RestStatus status = ex instanceof IOException ? RestStatus .BAD_REQUEST : ExceptionsHelper .status (ex );
145
+ String errorMessage = "failure parsing request body when a use case is given" ;
146
+ logger .error (errorMessage , ex );
147
+ throw new FlowFrameworkException (errorMessage , status );
148
+ }
149
+
150
+ }
151
+
152
+ useCaseTemplateFileInStringFormat = (String ) ParseUtils .conditionallySubstitute (
153
+ useCaseTemplateFileInStringFormat ,
154
+ null ,
155
+ useCaseDefaultsMap
156
+ );
157
+
158
+ XContentParser parserTestJson = ParseUtils .jsonToParser (useCaseTemplateFileInStringFormat );
159
+ ensureExpectedToken (XContentParser .Token .START_OBJECT , parserTestJson .currentToken (), parserTestJson );
160
+ template = Template .parse (parserTestJson );
161
+
162
+ } else {
163
+ XContentParser parser = request .contentParser ();
164
+ ensureExpectedToken (XContentParser .Token .START_OBJECT , parser .nextToken (), parser );
165
+ template = Template .parse (parser );
166
+ }
167
+
168
+ WorkflowRequest workflowRequest = new WorkflowRequest (
169
+ workflowId ,
170
+ template ,
171
+ validation ,
172
+ provision ,
173
+ params ,
174
+ useCase ,
175
+ useCaseDefaultsMap
176
+ );
120
177
121
178
return channel -> client .execute (CreateWorkflowAction .INSTANCE , workflowRequest , ActionListener .wrap (response -> {
122
179
XContentBuilder builder = response .toXContent (channel .newBuilder (), ToXContent .EMPTY_PARAMS );
@@ -134,11 +191,14 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
134
191
channel .sendResponse (new BytesRestResponse (ExceptionsHelper .status (e ), errorMessage ));
135
192
}
136
193
}));
194
+
137
195
} catch (FlowFrameworkException e ) {
196
+ logger .error ("failed to prepare rest request" , e );
138
197
return channel -> channel .sendResponse (
139
198
new BytesRestResponse (e .getRestStatus (), e .toXContent (channel .newErrorBuilder (), ToXContent .EMPTY_PARAMS ))
140
199
);
141
- } catch (IOException e ) {
200
+ } catch (Exception e ) {
201
+ logger .error ("failed to prepare rest request" , e );
142
202
FlowFrameworkException ex = new FlowFrameworkException (
143
203
"IOException: template content invalid for specified Content-Type." ,
144
204
RestStatus .BAD_REQUEST
0 commit comments