Skip to content

Commit 9dc655c

Browse files
committed
create SERVICE_OBJECTS and SERVICE_DEPENDENT_OBJECT table
1 parent 9b36a69 commit 9dc655c

File tree

10 files changed

+318
-1
lines changed

10 files changed

+318
-1
lines changed

modules/database/src/main/java/org/eclipse/xpanse/modules/database/servicechange/DatabaseServiceChangeRequestStorage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.springframework.stereotype.Component;
1818
import org.springframework.transaction.annotation.Transactional;
1919

20-
/** Implementation of the sStorage. */
20+
/** Implementation of the ServiceChangeRequestStorage. */
2121
@Component
2222
@Transactional
2323
public class DatabaseServiceChangeRequestStorage implements ServiceChangeRequestStorage {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*
5+
*/
6+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import java.util.UUID;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.stereotype.Component;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
/** Implementation of the ServiceObjectStorage. */
15+
@Component
16+
@Transactional
17+
public class DatabaseServiceObjectStorage implements ServiceObjectStorage {
18+
19+
private final ServiceObjectRepository repository;
20+
21+
@Autowired
22+
public DatabaseServiceObjectStorage(ServiceObjectRepository repository) {
23+
this.repository = repository;
24+
}
25+
26+
@Override
27+
public ServiceObjectEntity storeAndFlush(ServiceObjectEntity entity) {
28+
return repository.saveAndFlush(entity);
29+
}
30+
31+
@Override
32+
public void delete(ServiceObjectEntity entity) {
33+
repository.delete(entity);
34+
}
35+
36+
@Override
37+
public ServiceObjectEntity getEntityById(UUID objectId) {
38+
return repository.findById(objectId).orElse(null);
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*
5+
*/
6+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import io.hypersistence.utils.hibernate.type.json.JsonType;
10+
import jakarta.persistence.CollectionTable;
11+
import jakarta.persistence.Column;
12+
import jakarta.persistence.Convert;
13+
import jakarta.persistence.ElementCollection;
14+
import jakarta.persistence.Entity;
15+
import jakarta.persistence.FetchType;
16+
import jakarta.persistence.GeneratedValue;
17+
import jakarta.persistence.GenerationType;
18+
import jakarta.persistence.Id;
19+
import jakarta.persistence.JoinColumn;
20+
import jakarta.persistence.OneToOne;
21+
import jakarta.persistence.Table;
22+
import java.io.Serial;
23+
import java.io.Serializable;
24+
import java.util.Map;
25+
import java.util.Set;
26+
import java.util.UUID;
27+
import lombok.Data;
28+
import org.eclipse.xpanse.modules.database.common.ObjectJsonConverter;
29+
import org.eclipse.xpanse.modules.database.service.ServiceDeploymentEntity;
30+
import org.eclipse.xpanse.modules.models.servicetemplate.ObjectIdentifier;
31+
import org.hibernate.annotations.Type;
32+
33+
/** ServiceObjectEntity for persistence. */
34+
@Table(name = "SERVICE_OBJECT")
35+
@Entity
36+
@Data
37+
public class ServiceObjectEntity implements Serializable {
38+
39+
@Serial private static final long serialVersionUID = 8759122775257853274L;
40+
41+
@Id
42+
@GeneratedValue(strategy = GenerationType.UUID)
43+
@Column(name = "OBJECT_ID", nullable = false)
44+
private UUID objectId;
45+
46+
@OneToOne(fetch = FetchType.LAZY)
47+
@JoinColumn(name = "SERVICE_ID", nullable = false)
48+
private ServiceDeploymentEntity serviceDeploymentEntity;
49+
50+
@JoinColumn(name = "OBJECT_TYPE", nullable = false)
51+
private String objectType;
52+
53+
@JoinColumn(name = "OBJECT_IDENTIFIER", nullable = false)
54+
private ObjectIdentifier objectIdentifier;
55+
56+
@Column(name = "PROPERTIES", columnDefinition = "json", length = Integer.MAX_VALUE)
57+
@Type(value = JsonType.class)
58+
@Convert(converter = ObjectJsonConverter.class)
59+
private Map<String, Object> properties;
60+
61+
@ElementCollection
62+
@CollectionTable(
63+
name = "SERVICE_DEPENDENT_OBJECT",
64+
joinColumns = @JoinColumn(name = "OBJECT_ID", nullable = false) // 当前对象ID
65+
)
66+
@Column(name = "DEPENDENT_OBJECT_ID")
67+
private Set<UUID> dependentObjectIds;
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*
5+
*/
6+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import java.util.UUID;
10+
import org.eclipse.xpanse.modules.database.CustomJpaRepository;
11+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
12+
import org.springframework.stereotype.Repository;
13+
14+
/** Interface to access default JPA methods. */
15+
@Repository
16+
public interface ServiceObjectRepository
17+
extends CustomJpaRepository<ServiceObjectEntity, UUID>,
18+
JpaSpecificationExecutor<ServiceObjectEntity> {}
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+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import java.util.UUID;
10+
11+
/** Interface for persist of ServiceObjectEntity. */
12+
public interface ServiceObjectStorage {
13+
14+
ServiceObjectEntity storeAndFlush(ServiceObjectEntity entity);
15+
16+
void delete(ServiceObjectEntity entity);
17+
18+
ServiceObjectEntity getEntityById(UUID objectId);
19+
}

modules/database/src/main/java/org/eclipse/xpanse/modules/database/serviceorder/ServiceOrderEntity.java

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import lombok.Data;
2929
import org.eclipse.xpanse.modules.database.common.ObjectJsonConverter;
3030
import org.eclipse.xpanse.modules.database.service.ServiceDeploymentEntity;
31+
import org.eclipse.xpanse.modules.database.serviceobject.ServiceObjectEntity;
3132
import org.eclipse.xpanse.modules.models.response.ErrorResponse;
3233
import org.eclipse.xpanse.modules.models.service.enums.Handler;
3334
import org.eclipse.xpanse.modules.models.service.enums.OrderStatus;
@@ -56,6 +57,10 @@ public class ServiceOrderEntity implements Serializable {
5657
@OnDelete(action = OnDeleteAction.CASCADE)
5758
private ServiceDeploymentEntity serviceDeploymentEntity;
5859

60+
@ManyToOne(fetch = FetchType.LAZY)
61+
@JoinColumn(name = "OBJECT_ID")
62+
private ServiceObjectEntity serviceObjectEntity;
63+
5964
@Column(name = "PARENT_ORDER_ID")
6065
private UUID parentOrderId;
6166

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*
5+
*/
6+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertNull;
11+
import static org.mockito.ArgumentMatchers.any;
12+
import static org.mockito.Mockito.times;
13+
import static org.mockito.Mockito.verify;
14+
import static org.mockito.Mockito.when;
15+
16+
import java.util.Optional;
17+
import java.util.UUID;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
20+
import org.junit.jupiter.api.extension.ExtendWith;
21+
import org.mockito.InjectMocks;
22+
import org.mockito.Mock;
23+
import org.mockito.junit.jupiter.MockitoExtension;
24+
25+
/** Test for DatabaseServiceObjectStorage. */
26+
@ExtendWith(MockitoExtension.class)
27+
class DatabaseServiceObjectStorageTest {
28+
29+
@Mock private ServiceObjectRepository repository;
30+
31+
@InjectMocks private DatabaseServiceObjectStorage storage;
32+
33+
private final UUID objectId = UUID.randomUUID();
34+
private final ServiceObjectEntity testEntity = new ServiceObjectEntity();
35+
36+
@BeforeEach
37+
void setUp() {
38+
testEntity.setObjectId(objectId);
39+
}
40+
41+
@Test
42+
void storeAndFlushShouldCallRepositorySaveAndFlush() {
43+
when(repository.saveAndFlush(any(ServiceObjectEntity.class))).thenReturn(testEntity);
44+
ServiceObjectEntity result = storage.storeAndFlush(testEntity);
45+
verify(repository, times(1)).saveAndFlush(testEntity);
46+
assertEquals(testEntity, result);
47+
}
48+
49+
@Test
50+
void deleteShouldCallRepositoryDelete() {
51+
storage.delete(testEntity);
52+
verify(repository, times(1)).delete(testEntity);
53+
}
54+
55+
@Test
56+
void getEntityByIdShouldReturnEntityWhenExists() {
57+
when(repository.findById(objectId)).thenReturn(Optional.of(testEntity));
58+
ServiceObjectEntity result = storage.getEntityById(objectId);
59+
verify(repository, times(1)).findById(objectId);
60+
assertEquals(testEntity, result);
61+
}
62+
63+
@Test
64+
void getEntityByIdShouldReturnNullWhenNotExists() {
65+
when(repository.findById(objectId)).thenReturn(Optional.empty());
66+
ServiceObjectEntity result = storage.getEntityById(objectId);
67+
verify(repository, times(1)).findById(objectId);
68+
assertNull(result);
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*
5+
*/
6+
7+
package org.eclipse.xpanse.modules.database.serviceobject;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
import java.util.HashSet;
12+
import java.util.Map;
13+
import java.util.Set;
14+
import java.util.UUID;
15+
import org.eclipse.xpanse.modules.database.service.ServiceDeploymentEntity;
16+
import org.eclipse.xpanse.modules.models.servicetemplate.ObjectIdentifier;
17+
import org.junit.jupiter.api.BeforeEach;
18+
import org.junit.jupiter.api.Test;
19+
import org.mockito.Mock;
20+
import org.springframework.beans.BeanUtils;
21+
22+
/** Test for ServiceChangeRequestEntity. */
23+
public class ServiceObjectEntityTest {
24+
25+
private final UUID objectId = UUID.randomUUID();
26+
@Mock private ServiceDeploymentEntity serviceDeploymentEntity;
27+
private final String objectType = "ObjectType";
28+
@Mock private ObjectIdentifier objectIdentifier;
29+
private final Map<String, Object> properties = Map.of();
30+
private final Set<UUID> dependentObjectIds = new HashSet<>();
31+
32+
private ServiceObjectEntity test;
33+
34+
@BeforeEach
35+
void setUp() {
36+
test = new ServiceObjectEntity();
37+
test.setObjectId(objectId);
38+
test.setServiceDeploymentEntity(serviceDeploymentEntity);
39+
test.setObjectType(objectType);
40+
test.setObjectIdentifier(objectIdentifier);
41+
test.setProperties(properties);
42+
test.setDependentObjectIds(dependentObjectIds);
43+
}
44+
45+
@Test
46+
void testGetters() {
47+
assertThat(test.getObjectId()).isEqualTo(objectId);
48+
assertThat(test.getServiceDeploymentEntity()).isEqualTo(serviceDeploymentEntity);
49+
assertThat(test.getObjectType()).isEqualTo(objectType);
50+
assertThat(test.getObjectIdentifier()).isEqualTo(objectIdentifier);
51+
assertThat(test.getProperties()).isEqualTo(properties);
52+
assertThat(test.getDependentObjectIds()).isEqualTo(dependentObjectIds);
53+
}
54+
55+
@Test
56+
void testEquals() {
57+
assertThat(test.equals(new Object())).isFalse();
58+
ServiceObjectEntity test1 = new ServiceObjectEntity();
59+
BeanUtils.copyProperties(test, test1);
60+
assertThat(test.equals(test1)).isTrue();
61+
}
62+
63+
@Test
64+
void testHashCode() {
65+
assertThat(test.hashCode() == new Object().hashCode()).isFalse();
66+
ServiceObjectEntity test1 = new ServiceObjectEntity();
67+
BeanUtils.copyProperties(test, test1);
68+
assertThat(test.hashCode() == test1.hashCode()).isTrue();
69+
}
70+
71+
@Test
72+
void testToString() {
73+
String result =
74+
String.format(
75+
"ServiceObjectEntity(objectId=%s, "
76+
+ "serviceDeploymentEntity=%s, "
77+
+ "objectType=%s, "
78+
+ "objectIdentifier=%s, "
79+
+ "properties=%s, "
80+
+ "dependentObjectIds=%s)",
81+
objectId,
82+
serviceDeploymentEntity,
83+
objectType,
84+
objectIdentifier,
85+
properties,
86+
dependentObjectIds);
87+
88+
assertThat(test.toString()).isEqualTo(result);
89+
}
90+
}

modules/database/src/test/java/org/eclipse/xpanse/modules/database/serviceorder/ServiceOrderEntityTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Map;
99
import java.util.UUID;
1010
import org.eclipse.xpanse.modules.database.service.ServiceDeploymentEntity;
11+
import org.eclipse.xpanse.modules.database.serviceobject.ServiceObjectEntity;
1112
import org.eclipse.xpanse.modules.models.response.ErrorResponse;
1213
import org.eclipse.xpanse.modules.models.service.enums.Handler;
1314
import org.eclipse.xpanse.modules.models.service.enums.OrderStatus;
@@ -34,6 +35,7 @@ class ServiceOrderEntityTest {
3435
@Mock private Map<String, Object> mockRequestBody;
3536
@Mock private Map<String, Object> mockResultProperties;
3637
@Mock private ServiceDeploymentEntity mockServiceDeploymentEntity;
38+
@Mock private ServiceObjectEntity serviceObjectEntity;
3739

3840
private ServiceOrderEntity test;
3941

@@ -44,6 +46,7 @@ void setUp() {
4446
test.setParentOrderId(uuid);
4547
test.setWorkflowId(uuid.toString());
4648
test.setServiceDeploymentEntity(mockServiceDeploymentEntity);
49+
test.setServiceObjectEntity(serviceObjectEntity);
4750
test.setOriginalServiceId(uuid);
4851
test.setTaskType(taskType);
4952
test.setUserId(userId);
@@ -61,6 +64,7 @@ void testGetters() {
6164
assertThat(test.getOrderId()).isEqualTo(uuid);
6265
assertThat(test.getParentOrderId()).isEqualTo(uuid);
6366
assertThat(test.getServiceDeploymentEntity()).isEqualTo(mockServiceDeploymentEntity);
67+
assertThat(test.getServiceObjectEntity()).isEqualTo(serviceObjectEntity);
6468
assertThat(test.getOriginalServiceId()).isEqualTo(uuid);
6569
assertThat(test.getWorkflowId()).isEqualTo(uuid.toString());
6670
assertThat(test.getTaskType()).isEqualTo(taskType);
@@ -96,6 +100,8 @@ void testToString() {
96100
+ uuid
97101
+ ", serviceDeploymentEntity="
98102
+ mockServiceDeploymentEntity
103+
+ ", serviceObjectEntity="
104+
+ serviceObjectEntity
99105
+ ", parentOrderId="
100106
+ uuid
101107
+ ", workflowId="

modules/deployment/src/main/java/org/eclipse/xpanse/modules/deployment/ServiceOrderManager.java

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ public ServiceOrderEntity createAndStoreGenericServiceOrderEntity(
121121
serviceOrderEntity.setOrderStatus(OrderStatus.CREATED);
122122
serviceOrderEntity.setStartedTime(OffsetDateTime.now());
123123
serviceOrderEntity.setRequestBody(getRequestBody(originalRequest));
124+
serviceOrderEntity.setHandler(Handler.AGENT);
124125
return serviceOrderStorage.storeAndFlush(serviceOrderEntity);
125126
}
126127

0 commit comments

Comments
 (0)