* ============LICENSE_START=======================================================
* ONAP CLAMP
* ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights
* reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.onap.clamp.clds.model.properties.AbstractModelElement;
import org.onap.clamp.clds.service.SecureServicePermission;
import org.onap.clamp.clds.service.SecureServicePermissionDeserializer;
+import org.onap.clamp.dao.model.gson.converter.InstantDeserializer;
+import org.onap.clamp.dao.model.gson.converter.InstantSerializer;
/**
* This class is used to access the GSON with restricted type access.
public static final Gson GSON = new GsonBuilder()
.registerTypeAdapter(SecureServicePermission.class, new SecureServicePermissionDeserializer()).create();
+ public static final Gson GSON_JPA_MODEL = new GsonBuilder()
+ .registerTypeAdapter(Instant.class, new InstantSerializer())
+ .registerTypeAdapter(Instant.class, new InstantDeserializer()).setPrettyPrinting()
+ .excludeFieldsWithoutExposeAnnotation().create();
+
private JsonUtils() {
}
/**
- * Return the value field of the json node element that has a name field equals
- * to the given name.
+ * typeAdapter Return the value field of the json node element that has a name
+ * field equals to the given name.
*/
public static String getStringValueByName(JsonElement jsonElement, String name) {
String value = extractJsonValueFromElement(jsonElement, name).map(JsonUtils::extractStringValueFromElement)
import org.springframework.stereotype.Repository;
@Repository
-public interface LoopLogRepository extends CrudRepository<LoopLog, String> {
+public interface LoopLogRepository extends CrudRepository<LoopLog, Long> {
}
loopLogs.add(log);
log.setLoop(this);
}
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Loop other = (Loop) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
}
import java.io.Serializable;
import java.time.Instant;
+import java.time.temporal.ChronoUnit;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
+/**
+ *
+ * This class holds the logs created by the Clamp Backend. The Instant is always
+ * rounded to the nearest second as the nano seconds can't be stored in the
+ * database. The logs can be therefore exposed to the UI or the client doing
+ * some GET Loop on the backend.
+ *
+ */
@Entity
@Table(name = "loop_logs")
public class LoopLog implements Serializable {
@Expose
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
- private long id;
+ private Long id;
@Expose
@Column(name = "log_type", nullable = false)
@Expose
@Column(name = "log_instant", nullable = false)
- private Instant logInstant = Instant.now();
+ private Instant logInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS);
- public long getId() {
+ public Long getId() {
return id;
}
- public void setId(long id) {
+ public void setId(Long id) {
this.id = id;
}
}
public void setLogInstant(Instant logInstant) {
- this.logInstant = logInstant;
+ this.logInstant = logInstant.truncatedTo(ChronoUnit.SECONDS);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LoopLog other = (LoopLog) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
}
}
this.usedByLoops = usedBy;
}
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ MicroServicePolicy other = (MicroServicePolicy) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
}
this.configurationsJson = configurationsJson;
}
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OperationalPolicy other = (OperationalPolicy) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.dao.model.gson.converter;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+
+import java.lang.reflect.Type;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+public class InstantDeserializer implements JsonDeserializer<Instant> {
+
+ DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.US)
+ .withZone(ZoneId.systemDefault());
+
+ @Override
+ public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
+ return Instant.parse(json.getAsString());
+
+ }
+}
\ No newline at end of file
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.dao.model.gson.converter;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+
+public class InstantSerializer implements JsonSerializer<Instant> {
+
+ @Override
+ public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(DateTimeFormatter.ISO_INSTANT.format(src));
+ }
+}
\ No newline at end of file
@SpringBootTest
public class CldsDaoItCase {
- protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsDao.class);
+ protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsDaoItCase.class);
@Autowired
public CldsDao cldsDao;
private String bpmnText;
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.dao.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import com.google.gson.Gson;
+
+import java.util.Map;
+import java.util.Random;
+
+import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
+
+public class LoopToJsonTest {
+
+ private OperationalPolicy getOperationalPolicy(String configJson, String name) {
+ OperationalPolicy opPolicy = new OperationalPolicy();
+ opPolicy.setName(name);
+ opPolicy.setConfigurationsJson(new Gson().fromJson(configJson, Map.class));
+ return opPolicy;
+ }
+
+ private Loop getLoop(String name, String svgRepresentation, String blueprint, String globalPropertiesJson,
+ String dcaeId, String dcaeUrl) {
+ Loop loop = new Loop();
+ loop.setName(name);
+ loop.setSvgRepresentation(svgRepresentation);
+ loop.setBlueprint(blueprint);
+ loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, Map.class));
+ loop.setLastComputedState(LoopState.DESIGN);
+ loop.setDcaeDeploymentId(dcaeId);
+ loop.setDcaeDeploymentStatusUrl(dcaeUrl);
+ return loop;
+ }
+
+ private MicroServicePolicy getMicroServicePolicy(String name, String jsonRepresentation, String policyTosca,
+ String jsonProperties, boolean shared) {
+ MicroServicePolicy µService = new MicroServicePolicy();
+ µService.setJsonRepresentation(new Gson().fromJson(jsonRepresentation, Map.class));
+ µService.setPolicyTosca(policyTosca);
+ µService.setProperties(new Gson().fromJson(jsonProperties, Map.class));
+ µService.setShared(shared);
+
+ µService.setName(name);
+ return µService;
+ }
+
+ private LoopLog getLoopLog(LogType type, String message) {
+ LoopLog log = new LoopLog();
+ log.setLogType(type);
+ log.setMessage(message);
+ log.setId(Long.valueOf(new Random().nextInt()));
+ return log;
+ }
+
+ @Test
+ public void LoopGsonTest() {
+ Loop loopTest = getLoop("ControlLoopTest", "<xml></xml>", "yamlcontent", "{\"testname\":\"testvalue\"}",
+ "123456789", "https://dcaetest.org");
+ OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
+ loopTest.addOperationalPolicy(opPolicy);
+ MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "{\"configtype\":\"json\"}",
+ "YamlContent", "{\"param1\":\"value1\"}", true);
+ loopTest.addMicroServicePolicy(microServicePolicy);
+ LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+ loopTest.addLog(loopLog);
+
+ String jsonSerialized = JsonUtils.GSON_JPA_MODEL.toJson(loopTest);
+ assertThat(jsonSerialized).isNotNull().isNotEmpty();
+ System.out.println(jsonSerialized);
+ Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class);
+ assertNotNull(loopTestDeserialized);
+ assertThat(loopTestDeserialized).isEqualToComparingFieldByField(loopTest);
+ assertThat(loopTestDeserialized.getOperationalPolicies()).containsExactly(opPolicy);
+ assertThat(loopTestDeserialized.getMicroServicePolicies()).containsExactly(microServicePolicy);
+ assertThat(loopTestDeserialized.getLoopLogs()).containsExactly(loopLog);
+ assertThat((LoopLog) loopTestDeserialized.getLoopLogs().toArray()[0]).isEqualToIgnoringGivenFields(loopLog,
+ "loop");
+ }
+}
+++ /dev/null
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.it.dao.model;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-import java.util.Map;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.onap.clamp.clds.Application;
-import org.onap.clamp.dao.LoopsRepository;
-import org.onap.clamp.dao.model.LogType;
-import org.onap.clamp.dao.model.Loop;
-import org.onap.clamp.dao.model.LoopLog;
-import org.onap.clamp.dao.model.LoopState;
-import org.onap.clamp.dao.model.MicroServicePolicy;
-import org.onap.clamp.dao.model.OperationalPolicy;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringBootTest(classes = Application.class)
-public class LoopItCase {
-
- @Autowired
- private LoopsRepository loopRepository;
-
- @Test
- public void DecodeEncodeTest() {
- Loop loopTest = new Loop();
- loopTest.setName("ClosedLoopTest");
- loopTest.setSvgRepresentation("representation");
- loopTest.setBlueprint("blueprint");
- loopTest.setGlobalPropertiesJson(new Gson().fromJson("{\"testName\":\"testValue\"}", Map.class));
- loopTest.setLastComputedState(LoopState.DESIGN);
- loopTest.setBlueprint("yaml");
-
- OperationalPolicy opPolicy = new OperationalPolicy();
- opPolicy.setName("OpPolicyTest");
- opPolicy.setConfigurationsJson(new Gson().fromJson("{\"testname\":\"testvalue\"}", Map.class));
- opPolicy.setLoop(loopTest);
- loopTest.addOperationalPolicy(opPolicy);
-
- MicroServicePolicy µService = new MicroServicePolicy();
- µService.setJsonRepresentation(new Gson().fromJson("{\"testrepresentation\":\"value\"}", Map.class));
- µService.setPolicyTosca("tosca");
- µService.setProperties(new Gson().fromJson("{\"testparam\":\"testvalue\"}", Map.class));
- µService.setShared(true);
-
- µService.setName("ConfigPolicyTest");
- loopTest.addMicroServicePolicy(µService);
-
- LoopLog log = new LoopLog();
- log.setLogType(LogType.INFO);
- log.setMessage("test message");
-
- loopTest.addLog(log);
-
- Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
- String json = gson.toJson(loopTest);
- assertNotNull(json);
- Loop loopTestDecoded = gson.fromJson(json, Loop.class);
- assertNotNull(loopTestDecoded);
- Loop loop = gson.fromJson(json, Loop.class);
- assertNotNull(loop);
-
- Loop loopInDb = loopRepository.save(loopTest);
- assertNotNull(loopInDb);
- assertTrue(loopRepository.findById(loopInDb.getName()).get().getName().equals("ClosedLoopTest"));
- }
-}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.it.dao.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.time.Instant;
+import java.util.Map;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.clamp.clds.Application;
+import org.onap.clamp.dao.LoopLogRepository;
+import org.onap.clamp.dao.LoopsRepository;
+import org.onap.clamp.dao.MicroServicePolicyRepository;
+import org.onap.clamp.dao.OperationalPolicyRepository;
+import org.onap.clamp.dao.model.LogType;
+import org.onap.clamp.dao.model.Loop;
+import org.onap.clamp.dao.model.LoopLog;
+import org.onap.clamp.dao.model.LoopState;
+import org.onap.clamp.dao.model.MicroServicePolicy;
+import org.onap.clamp.dao.model.OperationalPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = Application.class)
+public class LoopRepositoriesItCase {
+
+ private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
+
+ @Autowired
+ private LoopsRepository loopRepository;
+
+ @Autowired
+ private MicroServicePolicyRepository microServicePolicyRepository;
+
+ @Autowired
+ private OperationalPolicyRepository operationalPolicyRepository;
+
+ @Autowired
+ private LoopLogRepository loopLogRepository;
+
+ private OperationalPolicy getOperationalPolicy(String configJson, String name) {
+ OperationalPolicy opPolicy = new OperationalPolicy();
+ opPolicy.setName(name);
+ opPolicy.setConfigurationsJson(new Gson().fromJson(configJson, Map.class));
+ return opPolicy;
+ }
+
+ private Loop getLoop(String name, String svgRepresentation, String blueprint, String globalPropertiesJson,
+ String dcaeId, String dcaeUrl) {
+ Loop loop = new Loop();
+ loop.setName(name);
+ loop.setSvgRepresentation(svgRepresentation);
+ loop.setBlueprint(blueprint);
+ loop.setGlobalPropertiesJson(new Gson().fromJson(globalPropertiesJson, Map.class));
+ loop.setLastComputedState(LoopState.DESIGN);
+ loop.setDcaeDeploymentId(dcaeId);
+ loop.setDcaeDeploymentStatusUrl(dcaeUrl);
+ return loop;
+ }
+
+ private MicroServicePolicy getMicroServicePolicy(String name, String jsonRepresentation, String policyTosca,
+ String jsonProperties, boolean shared) {
+ MicroServicePolicy µService = new MicroServicePolicy();
+ µService.setJsonRepresentation(new Gson().fromJson(jsonRepresentation, Map.class));
+ µService.setPolicyTosca(policyTosca);
+ µService.setProperties(new Gson().fromJson(jsonProperties, Map.class));
+ µService.setShared(shared);
+
+ µService.setName(name);
+ return µService;
+ }
+
+ private LoopLog getLoopLog(LogType type, String message) {
+ LoopLog log = new LoopLog();
+ log.setLogType(type);
+ log.setMessage(message);
+ return log;
+ }
+
+ @Test
+ @Transactional
+ public void CrudTest() {
+ Loop loopTest = getLoop("ControlLoopTest", "<xml></xml>", "yamlcontent", "{\"testname\":\"testvalue\"}",
+ "123456789", "https://dcaetest.org");
+ OperationalPolicy opPolicy = this.getOperationalPolicy("{\"type\":\"GUARD\"}", "GuardOpPolicyTest");
+ loopTest.addOperationalPolicy(opPolicy);
+ MicroServicePolicy microServicePolicy = getMicroServicePolicy("configPolicyTest", "{\"configtype\":\"json\"}",
+ "YamlContent", "{\"param1\":\"value1\"}", true);
+ loopTest.addMicroServicePolicy(microServicePolicy);
+ LoopLog loopLog = getLoopLog(LogType.INFO, "test message");
+ loopTest.addLog(loopLog);
+
+ // Attemp to save into the database the entire loop
+ Loop loopInDb = loopRepository.save(loopTest);
+ assertThat(loopInDb).isNotNull();
+ assertThat(loopInDb.getName()).isEqualTo("ControlLoopTest");
+ // Now set the ID in the previous model so that we can compare the objects
+ loopLog.setId(((LoopLog) loopInDb.getLoopLogs().toArray()[0]).getId());
+
+ assertThat(loopInDb).isEqualToComparingFieldByField(loopTest);
+ assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(true);
+ assertThat(operationalPolicyRepository.existsById(opPolicy.getName())).isEqualTo(true);
+ assertThat(microServicePolicyRepository.existsById(microServicePolicy.getName())).isEqualTo(true);
+ assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(true);
+
+ // Now attempt to read from database
+ Loop loopInDbRetrieved = loopRepository.findById(loopTest.getName()).get();
+ assertThat(loopInDbRetrieved).isEqualToComparingFieldByField(loopTest);
+ assertThat((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).isEqualToComparingFieldByField(loopLog);
+ assertThat((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0])
+ .isEqualToComparingFieldByField(opPolicy);
+ assertThat((MicroServicePolicy) loopInDbRetrieved.getMicroServicePolicies().toArray()[0])
+ .isEqualToComparingFieldByField(microServicePolicy);
+
+ // Attempt an update
+ ((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).setLogInstant(Instant.now());
+ loopRepository.save(loopInDbRetrieved);
+ Loop loopInDbRetrievedUpdated = loopRepository.findById(loopTest.getName()).get();
+ assertThat((LoopLog) loopInDbRetrievedUpdated.getLoopLogs().toArray()[0])
+ .isEqualToComparingFieldByField(loopInDbRetrieved.getLoopLogs().toArray()[0]);
+
+ // Attempt to delete the object and check it has well been cascaded
+ loopRepository.delete(loopInDbRetrieved);
+ assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(false);
+ assertThat(operationalPolicyRepository.existsById(opPolicy.getName())).isEqualTo(false);
+ assertThat(microServicePolicyRepository.existsById(microServicePolicy.getName())).isEqualTo(false);
+ assertThat(loopLogRepository.existsById(loopLog.getId())).isEqualTo(false);
+
+ }
+}
spring.datasource.cldsdb.testOnBorrow=true\r
spring.datasource.cldsdb.ignoreExceptionOnPreLoad=true\r
\r
-spring.jpa.properties.javax.persistence.schema-generation.database.action=none
+spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create
#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql