Skip to content

Commit 8873a18

Browse files
authored
Merge pull request eclipse-xpanse#1582 from WangLiNaruto/feature/ocl_eula
add eula status to deploymentRequest and service templates
2 parents 736410b + e56387f commit 8873a18

File tree

28 files changed

+1674
-49
lines changed

28 files changed

+1674
-49
lines changed

Diff for: modules/api/src/main/java/org/eclipse/xpanse/api/config/ServiceTemplateEntityConverter.java

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static ServiceTemplateDetailVo convertToServiceTemplateDetailVo(
5656
serviceTemplateEntity.getOcl().getServiceHostingType());
5757
serviceTemplateDetailVo.setServiceProviderContactDetails(
5858
serviceTemplateEntity.getOcl().getServiceProviderContactDetails());
59+
serviceTemplateDetailVo.setEula(serviceTemplateEntity.getOcl().getEula().orElse(null));
5960
return serviceTemplateDetailVo;
6061
}
6162
return null;
@@ -97,6 +98,7 @@ public static UserOrderableServiceVo convertToUserOrderableServiceVo(
9798
serviceTemplateEntity.getOcl().getServiceProviderContactDetails());
9899
userOrderableServiceVo.setServiceAvailability(
99100
serviceTemplateEntity.getOcl().getDeployment().getServiceAvailability());
101+
userOrderableServiceVo.setEula(serviceTemplateEntity.getOcl().getEula().orElse(null));
100102
return userOrderableServiceVo;
101103
}
102104
return null;

Diff for: modules/api/src/main/java/org/eclipse/xpanse/api/controllers/ServiceMigrationApi.java

+20
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.eclipse.xpanse.api.config.AuditApiRequest;
2727
import org.eclipse.xpanse.modules.database.service.DeployServiceEntity;
28+
import org.eclipse.xpanse.modules.database.servicetemplate.ServiceTemplateEntity;
2829
import org.eclipse.xpanse.modules.deployment.DeployServiceEntityHandler;
2930
import org.eclipse.xpanse.modules.deployment.migration.MigrationService;
3031
import org.eclipse.xpanse.modules.deployment.migration.consts.MigrateConstants;
32+
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.EulaNotAccepted;
3133
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.ServiceLockedException;
3234
import org.eclipse.xpanse.modules.models.workflow.migrate.MigrateRequest;
3335
import org.eclipse.xpanse.modules.models.workflow.migrate.enums.MigrationStatus;
@@ -82,6 +84,7 @@ public class ServiceMigrationApi {
8284
@ResponseStatus(HttpStatus.ACCEPTED)
8385
@AuditApiRequest(methodName = "getCspFromRequestUri")
8486
public UUID migrate(@Valid @RequestBody MigrateRequest migrateRequest) {
87+
validateEula(migrateRequest);
8588
DeployServiceEntity deployServiceEntity =
8689
this.deployServiceEntityHandler.getDeployServiceEntity(migrateRequest.getId());
8790
String userId = getUserId();
@@ -102,6 +105,23 @@ public UUID migrate(@Valid @RequestBody MigrateRequest migrateRequest) {
102105
return UUID.fromString(instance.getProcessInstanceId());
103106
}
104107

108+
private void validateEula(MigrateRequest migrateRequest) {
109+
ServiceTemplateEntity searchServiceTemplate = new ServiceTemplateEntity();
110+
searchServiceTemplate.setName(StringUtils.lowerCase(migrateRequest.getServiceName()));
111+
searchServiceTemplate.setVersion(StringUtils.lowerCase(migrateRequest.getVersion()));
112+
searchServiceTemplate.setCsp(migrateRequest.getCsp());
113+
searchServiceTemplate.setCategory(migrateRequest.getCategory());
114+
searchServiceTemplate.setServiceHostingType(migrateRequest.getServiceHostingType());
115+
ServiceTemplateEntity existingServiceTemplate =
116+
migrationService.findServiceTemplate(searchServiceTemplate);
117+
if (Objects.nonNull(existingServiceTemplate)
118+
&& existingServiceTemplate.getOcl().getEula().isPresent()
119+
&& !migrateRequest.isEulaAccepted()) {
120+
log.error("Service not accepted Eula.");
121+
throw new EulaNotAccepted("Service not accepted Eula.");
122+
}
123+
}
124+
105125
/**
106126
* List all services migration by a user.
107127
*

Diff for: modules/api/src/main/java/org/eclipse/xpanse/api/controllers/ServicePolicyManageApi.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,7 @@ public ServicePolicy updateServicePolicy(
119119
@Parameter(name = "id", description = "ID of the policy to be updated")
120120
@PathVariable("id") String id,
121121
@Valid @RequestBody ServicePolicyUpdateRequest updateRequest) {
122-
updateRequest.setId(UUID.fromString(id));
123-
return servicePolicyManager.updateServicePolicy(updateRequest);
122+
return servicePolicyManager.updateServicePolicy(UUID.fromString(id), updateRequest);
124123
}
125124

126125
/**

Diff for: modules/api/src/main/java/org/eclipse/xpanse/api/exceptions/handler/DeploymentExceptionHandler.java

+13
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.eclipse.xpanse.modules.models.response.ResultType;
1414
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.ActivitiTaskNotFoundException;
1515
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.DeployerNotFoundException;
16+
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.EulaNotAccepted;
1617
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.FlavorInvalidException;
1718
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.InvalidDeploymentVariableException;
1819
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.InvalidServiceStateException;
@@ -183,4 +184,16 @@ public Response handleServiceLockedException(
183184
return Response.errorResponse(ResultType.SERVICE_LOCKED,
184185
Collections.singletonList(ex.getMessage()));
185186
}
187+
188+
/**
189+
* Exception handler for ServiceLockedException.
190+
*/
191+
@ExceptionHandler({EulaNotAccepted.class})
192+
@ResponseStatus(HttpStatus.BAD_REQUEST)
193+
@ResponseBody
194+
public Response handleEulaNotAcceptedException(
195+
EulaNotAccepted ex) {
196+
return Response.errorResponse(ResultType.EULA_NOT_ACCEPTED,
197+
Collections.singletonList(ex.getMessage()));
198+
}
186199
}

Diff for: modules/deployment/src/main/java/org/eclipse/xpanse/modules/deployment/DeployService.java

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.eclipse.xpanse.modules.models.service.deploy.DeployRequest;
2424
import org.eclipse.xpanse.modules.models.service.deploy.enums.DeployerTaskStatus;
2525
import org.eclipse.xpanse.modules.models.service.deploy.enums.ServiceDeploymentState;
26+
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.EulaNotAccepted;
2627
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.FlavorInvalidException;
2728
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.InvalidServiceStateException;
2829
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.ServiceModifyParamsNotFoundException;
@@ -97,6 +98,11 @@ public DeployTask createNewDeployTask(DeployRequest deployRequest) {
9798
log.error(errMsg);
9899
throw new ServiceTemplateNotApproved("No available service templates found.");
99100
}
101+
if (existingServiceTemplate.getOcl().getEula().isPresent()
102+
&& !deployRequest.isEulaAccepted()) {
103+
log.error("Service not accepted Eula.");
104+
throw new EulaNotAccepted("Service not accepted Eula.");
105+
}
100106
// Check context validation
101107
validateDeployRequestWithServiceTemplate(existingServiceTemplate, deployRequest);
102108
sensitiveDataHandler.encodeDeployVariable(existingServiceTemplate,

Diff for: modules/deployment/src/main/java/org/eclipse/xpanse/modules/deployment/migration/MigrationService.java

+11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.eclipse.xpanse.modules.database.servicemigration.ServiceMigrationEntity;
1818
import org.eclipse.xpanse.modules.database.servicemigration.ServiceMigrationQueryModel;
1919
import org.eclipse.xpanse.modules.database.servicemigration.ServiceMigrationStorage;
20+
import org.eclipse.xpanse.modules.database.servicetemplate.ServiceTemplateEntity;
21+
import org.eclipse.xpanse.modules.database.servicetemplate.ServiceTemplateStorage;
2022
import org.eclipse.xpanse.modules.database.utils.EntityTransUtils;
2123
import org.eclipse.xpanse.modules.models.service.deploy.exceptions.ServiceMigrationNotFoundException;
2224
import org.eclipse.xpanse.modules.models.workflow.migrate.enums.MigrationStatus;
@@ -34,6 +36,8 @@ public class MigrationService {
3436

3537
@Resource
3638
private ServiceMigrationStorage serviceMigrationStorage;
39+
@Resource
40+
private ServiceTemplateStorage serviceTemplateStorage;
3741

3842
/**
3943
* Save or refresh ServiceMigrationEntity.
@@ -152,4 +156,11 @@ public List<ServiceMigrationDetails> listServiceMigrations(UUID migrationId, UUI
152156
}
153157
return serviceMigrationDetailsList;
154158
}
159+
160+
/**
161+
* Query service template.
162+
*/
163+
public ServiceTemplateEntity findServiceTemplate(ServiceTemplateEntity searchServiceTemplate) {
164+
return serviceTemplateStorage.findServiceTemplate(searchServiceTemplate);
165+
}
155166
}

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/policy/servicepolicy/ServicePolicyUpdateRequest.java

-10
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,14 @@
77
package org.eclipse.xpanse.modules.models.policy.servicepolicy;
88

99
import io.swagger.v3.oas.annotations.media.Schema;
10-
import jakarta.validation.constraints.NotNull;
1110
import java.util.List;
12-
import java.util.UUID;
1311
import lombok.Data;
1412

1513
/**
1614
* The model for updating the policy.
1715
*/
1816
@Data
1917
public class ServicePolicyUpdateRequest {
20-
21-
/**
22-
* The id of the policy.
23-
*/
24-
@NotNull
25-
@Schema(description = "The id of the policy.")
26-
private UUID id;
27-
2818
/**
2919
* The flavor name list which the policy belongs to.
3020
*/

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/response/ResultType.java

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public enum ResultType {
6262
SERVICE_MIGRATION_FAILED_EXCEPTION("Service Migration Failed Exception"),
6363
SERVICE_MIGRATION_NOT_FOUND("Service Migration Not Found"),
6464
SERVICE_LOCKED("Service Locked"),
65+
EULA_NOT_ACCEPTED("Eula not accepted"),
6566
INVALID_GIT_REPO_DETAILS("Invalid Git Repo Details");
6667

6768
private final String value;

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/service/deploy/DeployRequestBase.java

+3
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,7 @@ public class DeployRequestBase implements Serializable {
9595

9696
@Schema(description = "The availability zones to deploy the service instance.")
9797
private Map<String, String> availabilityZones;
98+
99+
@Schema(description = "The flag to determine if the user has accepted the EULA terms.")
100+
private boolean isEulaAccepted;
98101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*/
5+
6+
package org.eclipse.xpanse.modules.models.service.deploy.exceptions;
7+
8+
/**
9+
* Exception thrown when the service template defines an EULA but the end user has requested for the
10+
* service without accepting it.
11+
*/
12+
public class EulaNotAccepted extends RuntimeException {
13+
14+
public EulaNotAccepted(String message) {
15+
super(message);
16+
}
17+
18+
}
19+

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/servicetemplate/Ocl.java

+31
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.eclipse.xpanse.modules.models.servicetemplate;
77

88
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
910
import io.swagger.v3.oas.annotations.media.Schema;
1011
import jakarta.validation.Valid;
1112
import jakarta.validation.constraints.NotBlank;
@@ -15,11 +16,15 @@
1516
import java.io.Serializable;
1617
import java.io.StringReader;
1718
import java.io.StringWriter;
19+
import java.util.Objects;
20+
import java.util.Optional;
1821
import lombok.Data;
1922
import lombok.extern.slf4j.Slf4j;
23+
import org.apache.commons.lang3.StringUtils;
2024
import org.eclipse.xpanse.modules.models.common.enums.Category;
2125
import org.eclipse.xpanse.modules.models.common.exceptions.XpanseUnhandledException;
2226
import org.eclipse.xpanse.modules.models.servicetemplate.enums.ServiceHostingType;
27+
import org.eclipse.xpanse.modules.models.servicetemplate.utils.OptionalToStringSerializer;
2328
import org.eclipse.xpanse.modules.models.servicetemplate.validators.DeploymentScriptsConstraint;
2429

2530
/**
@@ -104,6 +109,32 @@ public class Ocl implements Serializable {
104109
@Schema(description = "The contact details of the service provider.")
105110
private ServiceProviderContactDetails serviceProviderContactDetails;
106111

112+
@JsonSerialize(converter = OptionalToStringSerializer.class)
113+
@Schema(description = "End user license agreement content of the service.")
114+
private Optional<String> eula;
115+
116+
/**
117+
* Get eula.
118+
*/
119+
public Optional<String> getEula() {
120+
if (Objects.nonNull(eula)) {
121+
return eula;
122+
} else {
123+
return Optional.empty();
124+
}
125+
}
126+
127+
/**
128+
* Set eula.
129+
*/
130+
public void setEula(String eula) {
131+
if (StringUtils.isNotBlank(eula)) {
132+
this.eula = Optional.of(eula);
133+
} else {
134+
this.eula = Optional.empty();
135+
}
136+
}
137+
107138
/**
108139
* an OCL object might be passed to different plugins for processing, in case any plugin want to
109140
* change the property of Ocl, we should not change the original Object, we should change a deep
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*/
5+
6+
package org.eclipse.xpanse.modules.models.servicetemplate.utils;
7+
8+
import com.fasterxml.jackson.databind.util.StdConverter;
9+
import java.util.Optional;
10+
11+
/**
12+
* Optional is converted into String serialization class.
13+
*/
14+
public class OptionalToStringSerializer extends StdConverter<Optional<String>, String> {
15+
16+
/**
17+
* Optional convert String.
18+
*/
19+
@Override
20+
public String convert(Optional<String> value) {
21+
return value.orElse(null);
22+
}
23+
}

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/servicetemplate/view/ServiceTemplateDetailVo.java

+30
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
import jakarta.validation.constraints.NotNull;
1717
import java.time.OffsetDateTime;
1818
import java.util.List;
19+
import java.util.Objects;
20+
import java.util.Optional;
1921
import java.util.UUID;
2022
import lombok.Data;
2123
import lombok.EqualsAndHashCode;
24+
import org.apache.commons.lang3.StringUtils;
2225
import org.eclipse.xpanse.modules.models.common.enums.Category;
2326
import org.eclipse.xpanse.modules.models.common.enums.Csp;
2427
import org.eclipse.xpanse.modules.models.servicetemplate.Billing;
@@ -29,6 +32,7 @@
2932
import org.eclipse.xpanse.modules.models.servicetemplate.ServiceProviderContactDetails;
3033
import org.eclipse.xpanse.modules.models.servicetemplate.enums.ServiceHostingType;
3134
import org.eclipse.xpanse.modules.models.servicetemplate.enums.ServiceRegistrationState;
35+
import org.eclipse.xpanse.modules.models.servicetemplate.utils.OptionalToStringSerializer;
3236
import org.springframework.hateoas.RepresentationModel;
3337

3438
/**
@@ -125,4 +129,30 @@ public class ServiceTemplateDetailVo extends RepresentationModel<ServiceTemplate
125129
@Schema(description = "The contact details of the service provider.")
126130
private ServiceProviderContactDetails serviceProviderContactDetails;
127131

132+
@JsonSerialize(converter = OptionalToStringSerializer.class)
133+
@Schema(description = "End user license agreement content of the service.")
134+
private Optional<String> eula;
135+
136+
/**
137+
* Get eula.
138+
*/
139+
public Optional<String> getEula() {
140+
if (Objects.nonNull(eula)) {
141+
return eula;
142+
} else {
143+
return Optional.empty();
144+
}
145+
}
146+
147+
/**
148+
* Set eula.
149+
*/
150+
public void setEula(String eula) {
151+
if (StringUtils.isNotBlank(eula)) {
152+
this.eula = Optional.of(eula);
153+
} else {
154+
this.eula = Optional.empty();
155+
}
156+
}
157+
128158
}

Diff for: modules/models/src/main/java/org/eclipse/xpanse/modules/models/servicetemplate/view/UserOrderableServiceVo.java

+31
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66

77
package org.eclipse.xpanse.modules.models.servicetemplate.view;
88

9+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
910
import io.swagger.v3.oas.annotations.media.Schema;
1011
import jakarta.validation.Valid;
1112
import jakarta.validation.constraints.NotBlank;
1213
import jakarta.validation.constraints.NotEmpty;
1314
import jakarta.validation.constraints.NotNull;
1415
import java.util.List;
16+
import java.util.Objects;
17+
import java.util.Optional;
1518
import java.util.UUID;
1619
import lombok.Data;
1720
import lombok.EqualsAndHashCode;
21+
import org.apache.commons.lang3.StringUtils;
1822
import org.eclipse.xpanse.modules.models.common.enums.Category;
1923
import org.eclipse.xpanse.modules.models.common.enums.Csp;
2024
import org.eclipse.xpanse.modules.models.servicetemplate.AvailabilityZoneConfig;
@@ -24,6 +28,7 @@
2428
import org.eclipse.xpanse.modules.models.servicetemplate.ServiceFlavor;
2529
import org.eclipse.xpanse.modules.models.servicetemplate.ServiceProviderContactDetails;
2630
import org.eclipse.xpanse.modules.models.servicetemplate.enums.ServiceHostingType;
31+
import org.eclipse.xpanse.modules.models.servicetemplate.utils.OptionalToStringSerializer;
2732
import org.springframework.hateoas.RepresentationModel;
2833

2934
/**
@@ -93,4 +98,30 @@ public class UserOrderableServiceVo extends RepresentationModel<UserOrderableSer
9398

9499
@Schema(description = "The list of availability zones of the service.")
95100
private List<AvailabilityZoneConfig> serviceAvailability;
101+
102+
@JsonSerialize(converter = OptionalToStringSerializer.class)
103+
@Schema(description = "End user license agreement content of the service.")
104+
private Optional<String> eula;
105+
106+
/**
107+
* Get eula.
108+
*/
109+
public Optional<String> getEula() {
110+
if (Objects.nonNull(eula)) {
111+
return eula;
112+
} else {
113+
return Optional.empty();
114+
}
115+
}
116+
117+
/**
118+
* Set eula.
119+
*/
120+
public void setEula(String eula) {
121+
if (StringUtils.isNotBlank(eula)) {
122+
this.eula = Optional.of(eula);
123+
} else {
124+
this.eula = Optional.empty();
125+
}
126+
}
96127
}

0 commit comments

Comments
 (0)