in server/src/main/java/com/epam/aidial/core/server/service/ApplicationService.java [287:340]
public void copyApplication(ResourceDescriptor source, ResourceDescriptor destination, boolean overwrite, Consumer<Application> consumer) {
verifyApplication(source);
verifyApplication(destination);
Application application = getApplication(source).getValue();
Application.Function function = application.getFunction();
EtagHeader etag = overwrite ? EtagHeader.ANY : EtagHeader.NEW_ONLY;
consumer.accept(application);
application.setName(destination.getUrl());
boolean isPublicOrReview = isPublicOrReview(destination);
String sourceFolder = (function == null) ? null : function.getSourceFolder();
resourceService.computeResource(destination, etag, json -> {
Application existing = ProxyUtil.convertToObject(json, Application.class);
if (function != null) {
if (existing == null || existing.getFunction() == null) {
function.setId(UrlUtil.encodePathSegment(idGenerator.get()));
function.setStatus(Application.Function.Status.UNDEPLOYED);
function.setTargetFolder(encodeTargetFolder(destination, function.getId()));
if (isPublicOrReview) {
function.setSourceFolder(function.getTargetFolder());
} else {
function.setAuthorBucket(destination.getBucketName());
}
} else {
if (isPublicOrReview) {
throw new HttpException(HttpStatus.CONFLICT, "The application function must be deleted in public/review bucket");
}
application.setEndpoint(existing.getEndpoint());
application.getFeatures().setRateEndpoint(existing.getFeatures().getRateEndpoint());
application.getFeatures().setTokenizeEndpoint(existing.getFeatures().getTokenizeEndpoint());
application.getFeatures().setTruncatePromptEndpoint(existing.getFeatures().getTruncatePromptEndpoint());
application.getFeatures().setConfigurationEndpoint(existing.getFeatures().getConfigurationEndpoint());
function.setId(existing.getFunction().getId());
function.setAuthorBucket(existing.getFunction().getAuthorBucket());
function.setStatus(existing.getFunction().getStatus());
function.setTargetFolder(existing.getFunction().getTargetFolder());
function.setError(existing.getFunction().getError());
}
}
return ProxyUtil.convertToString(application);
});
// for public/review application source folder is equal to target folder
// source files are copied to read-only deployment bucket for such applications
if (isPublicOrReview && function != null) {
copyFolder(sourceFolder, function.getSourceFolder(), false);
}
}