99
1010import org .apache .logging .log4j .LogManager ;
1111import org .apache .logging .log4j .Logger ;
12+ import org .elasticsearch .ElasticsearchSecurityException ;
1213import org .elasticsearch .ElasticsearchStatusException ;
1314import org .elasticsearch .ExceptionsHelper ;
1415import org .elasticsearch .ResourceNotFoundException ;
2324import org .elasticsearch .inference .Model ;
2425import org .elasticsearch .inference .TaskType ;
2526import org .elasticsearch .inference .UnparsedModel ;
27+ import org .elasticsearch .rest .RestStatus ;
2628import org .elasticsearch .xpack .core .ClientHelper ;
29+ import org .elasticsearch .xpack .core .inference .action .DeleteInferenceEndpointAction ;
2730import org .elasticsearch .xpack .core .ml .MachineLearningField ;
2831import org .elasticsearch .xpack .core .ml .action .GetTrainedModelsAction ;
2932import org .elasticsearch .xpack .core .ml .action .InferModelAction ;
@@ -155,9 +158,14 @@ public void putModel(Model model, ActionListener<Boolean> listener) {
155158 listener .onFailure (notElasticsearchModelException (model ));
156159 return ;
157160 } else if (model instanceof MultilingualE5SmallModel e5Model ) {
158- putBuiltInModel (e5Model .getServiceSettings ().modelId (), listener );
161+ putBuiltInModel (e5Model .getServiceSettings ().modelId (), e5Model . getInferenceEntityId (), e5Model . getTaskType (), listener );
159162 } else if (model instanceof ElserInternalModel elserModel ) {
160- putBuiltInModel (elserModel .getServiceSettings ().modelId (), listener );
163+ putBuiltInModel (
164+ elserModel .getServiceSettings ().modelId (),
165+ elserModel .getInferenceEntityId (),
166+ elserModel .getTaskType (),
167+ listener
168+ );
161169 } else if (model instanceof CustomElandModel ) {
162170 logger .info ("Custom eland model detected, model must have been already loaded into the cluster with eland." );
163171 listener .onResponse (Boolean .TRUE );
@@ -173,7 +181,7 @@ public void putModel(Model model, ActionListener<Boolean> listener) {
173181 }
174182 }
175183
176- protected void putBuiltInModel (String modelId , ActionListener <Boolean > listener ) {
184+ protected void putBuiltInModel (String modelId , String inferenceId , TaskType taskType , ActionListener <Boolean > listener ) {
177185 var input = new TrainedModelInput (List .<String >of ("text_field" )); // by convention text_field is used
178186 var config = TrainedModelConfig .builder ().setInput (input ).setModelId (modelId ).validate (true ).build ();
179187 PutTrainedModelAction .Request putRequest = new PutTrainedModelAction .Request (config , false , true );
@@ -186,9 +194,26 @@ protected void putBuiltInModel(String modelId, ActionListener<Boolean> listener)
186194 if (e instanceof ElasticsearchStatusException esException
187195 && esException .getMessage ().contains (PutTrainedModelAction .MODEL_ALREADY_EXISTS_ERROR_MESSAGE_FRAGMENT )) {
188196 listener .onResponse (Boolean .TRUE );
189- } else {
190- listener .onFailure (e );
191- }
197+ } else if (e instanceof ElasticsearchSecurityException esException
198+ && esException .getMessage ().contains (PutTrainedModelAction .LICENSE_NON_COMPLIANT_ERROR_MESSAGE_FRAGMENT )) {
199+ var deleteRequest = new DeleteInferenceEndpointAction .Request (inferenceId , taskType , true , false );
200+ client .execute (
201+ DeleteInferenceEndpointAction .INSTANCE ,
202+ deleteRequest ,
203+ ActionListener .wrap (
204+ r -> listener .onFailure (e ),
205+ e1 -> listener .onFailure (
206+ new ElasticsearchStatusException (
207+ "Failed to delete the inference endpoint after failing to start the trained model due to "
208+ + "non-compliant license" ,
209+ RestStatus .FORBIDDEN
210+ )
211+ )
212+ )
213+ );
214+ } else {
215+ listener .onFailure (e );
216+ }
192217 })
193218 );
194219 }
0 commit comments