Skip to content

Commit da3ca39

Browse files
authored
create SERVICE_OBJECTS and SERVICE_DEPENDENT_OBJECT table (#2494)
1 parent 9b36a69 commit da3ca39

File tree

14 files changed

+328
-7
lines changed

14 files changed

+328
-7
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,66 @@
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.hibernate.annotations.Type;
31+
32+
/** ServiceObjectEntity for persistence. */
33+
@Table(name = "SERVICE_OBJECT")
34+
@Entity
35+
@Data
36+
public class ServiceObjectEntity implements Serializable {
37+
38+
@Serial private static final long serialVersionUID = 8759122775257853274L;
39+
40+
@Id
41+
@GeneratedValue(strategy = GenerationType.UUID)
42+
@Column(name = "OBJECT_ID", nullable = false)
43+
private UUID objectId;
44+
45+
@OneToOne(fetch = FetchType.LAZY)
46+
@JoinColumn(name = "SERVICE_ID", nullable = false)
47+
private ServiceDeploymentEntity serviceDeploymentEntity;
48+
49+
@JoinColumn(name = "OBJECT_TYPE", nullable = false)
50+
private String objectType;
51+
52+
@JoinColumn(name = "OBJECT_IDENTIFIER", nullable = false)
53+
private String objectIdentifierName;
54+
55+
@Column(name = "PROPERTIES", columnDefinition = "json", length = Integer.MAX_VALUE)
56+
@Type(value = JsonType.class)
57+
@Convert(converter = ObjectJsonConverter.class)
58+
private Map<String, Object> properties;
59+
60+
@ElementCollection
61+
@CollectionTable(
62+
name = "SERVICE_DEPENDENT_OBJECT",
63+
joinColumns = @JoinColumn(name = "OBJECT_ID", nullable = false))
64+
@Column(name = "DEPENDENT_OBJECT_ID")
65+
private Set<UUID> dependentObjectIds;
66+
}
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,89 @@
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.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.Test;
18+
import org.mockito.Mock;
19+
import org.springframework.beans.BeanUtils;
20+
21+
/** Test for ServiceChangeRequestEntity. */
22+
public class ServiceObjectEntityTest {
23+
24+
private final UUID objectId = UUID.randomUUID();
25+
@Mock private ServiceDeploymentEntity serviceDeploymentEntity;
26+
private final String objectType = "ObjectType";
27+
private final String objectIdentifierName = "test";
28+
private final Map<String, Object> properties = Map.of();
29+
private final Set<UUID> dependentObjectIds = new HashSet<>();
30+
31+
private ServiceObjectEntity test;
32+
33+
@BeforeEach
34+
void setUp() {
35+
test = new ServiceObjectEntity();
36+
test.setObjectId(objectId);
37+
test.setServiceDeploymentEntity(serviceDeploymentEntity);
38+
test.setObjectType(objectType);
39+
test.setObjectIdentifierName(objectIdentifierName);
40+
test.setProperties(properties);
41+
test.setDependentObjectIds(dependentObjectIds);
42+
}
43+
44+
@Test
45+
void testGetters() {
46+
assertThat(test.getObjectId()).isEqualTo(objectId);
47+
assertThat(test.getServiceDeploymentEntity()).isEqualTo(serviceDeploymentEntity);
48+
assertThat(test.getObjectType()).isEqualTo(objectType);
49+
assertThat(test.getObjectIdentifierName()).isEqualTo(objectIdentifierName);
50+
assertThat(test.getProperties()).isEqualTo(properties);
51+
assertThat(test.getDependentObjectIds()).isEqualTo(dependentObjectIds);
52+
}
53+
54+
@Test
55+
void testEquals() {
56+
assertThat(test.equals(new Object())).isFalse();
57+
ServiceObjectEntity test1 = new ServiceObjectEntity();
58+
BeanUtils.copyProperties(test, test1);
59+
assertThat(test.equals(test1)).isTrue();
60+
}
61+
62+
@Test
63+
void testHashCode() {
64+
assertThat(test.hashCode() == new Object().hashCode()).isFalse();
65+
ServiceObjectEntity test1 = new ServiceObjectEntity();
66+
BeanUtils.copyProperties(test, test1);
67+
assertThat(test.hashCode() == test1.hashCode()).isTrue();
68+
}
69+
70+
@Test
71+
void testToString() {
72+
String result =
73+
String.format(
74+
"ServiceObjectEntity(objectId=%s, "
75+
+ "serviceDeploymentEntity=%s, "
76+
+ "objectType=%s, "
77+
+ "objectIdentifierName=%s, "
78+
+ "properties=%s, "
79+
+ "dependentObjectIds=%s)",
80+
objectId,
81+
serviceDeploymentEntity,
82+
objectType,
83+
objectIdentifierName,
84+
properties,
85+
dependentObjectIds);
86+
87+
assertThat(test.toString()).isEqualTo(result);
88+
}
89+
}

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/ServiceActionManager.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.eclipse.xpanse.modules.database.servicetemplate.ServiceTemplateStorage;
2525
import org.eclipse.xpanse.modules.models.service.deployment.DeployResource;
2626
import org.eclipse.xpanse.modules.models.service.enums.DeployResourceKind;
27+
import org.eclipse.xpanse.modules.models.service.enums.Handler;
2728
import org.eclipse.xpanse.modules.models.service.enums.OrderStatus;
2829
import org.eclipse.xpanse.modules.models.service.order.ServiceOrder;
2930
import org.eclipse.xpanse.modules.models.service.order.enums.ServiceOrderType;
@@ -182,7 +183,8 @@ private UUID addServiceChangeRequestsForServiceAction(
182183
serviceActionRequest.getActionName()),
183184
deployResourceMap,
184185
actionManageScripts,
185-
ServiceOrderType.SERVICE_ACTION);
186+
ServiceOrderType.SERVICE_ACTION,
187+
Handler.AGENT);
186188
}
187189

188190
/**

0 commit comments

Comments
 (0)