diff options
author | Steve Alphonse Siani <alphonse.steve.siani.djissitchi@ibm.com> | 2018-12-21 10:31:48 -0500 |
---|---|---|
committer | Steve Alphonse Siani <alphonse.steve.siani.djissitchi@ibm.com> | 2018-12-21 15:43:49 -0500 |
commit | a19a6d1683689ffcc95f160b0c2ed4718505e7f4 (patch) | |
tree | fab6a7918c707696368475e9e8c5e2d04b12970d /ms/controllerblueprints/modules/service/src/main | |
parent | 40d739b066bbc44b82e484ec204132c4652552b2 (diff) |
Applied comments from review: Change 74622 - Draft
Change-Id: I8ec37a628af98a332f568dc254e499dfdcf886ce
Issue-ID: CCSDK-418
Signed-off-by: Steve Alphonse Siani <alphonse.steve.siani.djissitchi@ibm.com>
Diffstat (limited to 'ms/controllerblueprints/modules/service/src/main')
13 files changed, 1010 insertions, 3 deletions
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CBAContentService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CBAContentService.java new file mode 100755 index 000000000..66ef6a934 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CBAContentService.java @@ -0,0 +1,97 @@ +/* + * Copyright © 2018 IBM Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * 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. + */ +package org.onap.ccsdk.apps.controllerblueprints.service; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.onap.ccsdk.apps.controllerblueprints.service.domain.CbaContent; +import org.onap.ccsdk.apps.controllerblueprints.service.repository.CBAContentRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * CBAContentService.java Purpose: Provide CBAContent Template Service processing + * CBAContentService + * + * @author Ruben Chang + * @version 1.0 + */ + +@Service +public class CBAContentService { + + private static EELFLogger log = EELFManager.getInstance().getLogger(CBAContentService.class); + + private CBAContentRepository cbaContentRepository; + + /** + * Constructor of the class + * @param cbaContentRepository CRUD methods for entity CBAContentRepository + */ + public CBAContentService(CBAContentRepository cbaContentRepository) { + this.cbaContentRepository = cbaContentRepository; + log.info("CBAContentRepository sucessfully instantiated"); + } + + /** + * Save the CBAContent into the CBA_CONTENT table + * @param cbaName The name of the file + * @param cbaVersion version number of the CBA archive + * @param cbaState int that would represent the state. Refer to the CbaStateEnum + * @param cbaDescription Brief description that would help to identify and recognize the CBA archive + * @param file the file + * @return CbaContent the record saved into the table CBA_CONTENT + */ + public CbaContent saveCBAContent(String cbaName, String cbaVersion, int cbaState, String cbaDescription, byte[] file){ + CbaContent cbaContent = new CbaContent(); + cbaContent.setCbaName(cbaName); + cbaContent.setCbaVersion(cbaVersion); + cbaContent.setCbaState(cbaState); + cbaContent.setCbaDescription(cbaDescription); + cbaContent.setCbaFile(file); + cbaContentRepository.saveAndFlush(cbaContent); + return cbaContent; + } + + /** + * Get the list of Controller Blueprint archives + * @return List<CbaContent> list with the controller blueprint archives + */ + public List<CbaContent> getList(){ + return cbaContentRepository.findAll(); + } + + /** + * Get a single Controller Blueprint archive by uuID + * @param uuID the userID controller blueprint identifier + * @return Optional<CbaContent> + */ + public Optional<CbaContent> findByUUID(String uuID) { + return cbaContentRepository.findById(uuID); + } + + /** + * Method deleteCBAById: Delete a CBA in data base with it associated Blueprint Model + * @param uuid the uuid that identify the CBA + */ + public void deleteCBAById(String uuid) { + cbaContentRepository.deleteById(uuid); + } + +} diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaFileManagementService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaFileManagementService.java new file mode 100755 index 000000000..2011172dc --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaFileManagementService.java @@ -0,0 +1,128 @@ +/*
+ * Copyright © 2018 IBM Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.service;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException;
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.BluePrintArchiveUtils;
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.BluePrintFileUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.codec.multipart.FilePart;
+import org.springframework.stereotype.Service;
+import org.springframework.util.FileSystemUtils;
+import org.springframework.util.StringUtils;
+import reactor.core.publisher.Mono;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * CbaFileManagementService.java Purpose: Provide Service processing CBA file management
+ *
+ * @author Steve Siani
+ * @version 1.0
+ */
+@Service
+public class CbaFileManagementService {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CbaFileManagementService.class);
+
+ @Value("${controllerblueprints.loadCbaExtension}")
+ private String cbaExtension;
+
+ private static final String CBA_FILE_NAME_PATTERN = "CBA_{0}_{1}";
+
+
+ /**
+ * cleanupSavedCBA: This method cleanup the Zip file and the unzip directory that was added.
+ *
+ * @param zipFileName zipFileName
+ * @param cbaFileLocation cbaFileLocation
+ * @return
+ * @throws BluePrintException BluePrintException
+ */
+ public void cleanupSavedCBA(String zipFileName, Path cbaFileLocation) throws BluePrintException {
+
+ String fileNameWithoutExtension = BluePrintFileUtils.Companion.stripFileExtension(zipFileName);
+
+ //Delete the Zip file from the repository
+ FileSystemUtils.deleteRecursively(BluePrintFileUtils.Companion.getBluePrintFile(zipFileName,cbaFileLocation));
+
+ //Delete the CBA directory from the repository
+ FileSystemUtils.deleteRecursively(BluePrintFileUtils.Companion.getBluePrintFile(fileNameWithoutExtension,cbaFileLocation));
+ }
+
+ /**
+ * This is a saveCBAFile method
+ * take a {@link FilePart}, transfer it to disk using a Flux of FilePart and return a {@link Mono} representing the CBA file name
+ *
+ * @param (filePart, targetDirectory) - the request part containing the file to be saved and the default directory where to save
+ * @return a {@link Mono} String representing the result of the operation
+ * @throws (BluePrintException, IOException) BluePrintException, IOException
+ */
+ public Mono<String> saveCBAFile(FilePart filePart, Path targetDirectory) throws BluePrintException, IOException {
+
+ // Normalize file name
+ final String fileName = StringUtils.cleanPath(filePart.filename());
+
+ // Check if the file's extension is "CBA"
+ if(!StringUtils.getFilenameExtension(fileName).equals(cbaExtension)) {
+ throw new BluePrintException("Invalid file extension required " + cbaExtension);
+ }
+
+ // Change file name to match a pattern
+ String changedFileName = BluePrintFileUtils.Companion.getCBAGeneratedFileName(fileName, this.CBA_FILE_NAME_PATTERN);
+
+ // Copy file to the target location (Replacing existing file with the same name)
+ Path targetLocation = targetDirectory.resolve(changedFileName);
+
+ // if a file with the same name already exists in a repository, delete and recreate it
+ File file = new File(targetLocation.toString());
+ if (file.exists())
+ file.delete();
+ file.createNewFile();
+
+ return filePart.transferTo(file).thenReturn(changedFileName);
+ }
+
+ /**
+ * Decompress the file into the cbaFileLocation parameter
+ * @param zipFileName name of the zipped file
+ * @param cbaFileLocation path in which the zipped file will get decompressed
+ * @return String the path in which the file is decompressed
+ * @throws BluePrintException Exception in the process
+ */
+ public String decompressCBAFile(final String zipFileName, Path cbaFileLocation) throws BluePrintException {
+
+ File file = BluePrintFileUtils.Companion.getBluePrintFile(zipFileName, cbaFileLocation);
+ try {
+ Path directoryPath = Files.createDirectories(cbaFileLocation.resolve(BluePrintFileUtils.Companion.stripFileExtension(zipFileName)));
+ BluePrintArchiveUtils.Companion.deCompress(file, directoryPath.toString());
+ return directoryPath.toString();
+
+ } catch (BluePrintProcessorException | IOException ex) {
+ throw new BluePrintException(" Fail to decompress " + zipFileName, ex);
+ }
+
+ }
+
+
+}
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaService.java new file mode 100755 index 000000000..7d616a76f --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaService.java @@ -0,0 +1,192 @@ +/*
+ * Copyright © 2018 IBM Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.service;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.jetbrains.annotations.NotNull;
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.BluePrintFileUtils;
+import org.onap.ccsdk.apps.controllerblueprints.service.domain.CbaContent;
+import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModel;
+import org.onap.ccsdk.apps.controllerblueprints.service.model.BlueprintModelResponse;
+import org.onap.ccsdk.apps.controllerblueprints.service.model.ItemCbaResponse;
+import org.onap.ccsdk.apps.controllerblueprints.service.utils.CbaStateEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.codec.multipart.FilePart;
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * CbaService.java Purpose: Provide Service Template Service processing CbaService
+ *
+ * @author Steve Siani
+ * @version 1.0
+ */
+
+@Service
+public class CbaService {
+
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CbaService.class);
+
+ @Value("${controllerblueprints.blueprintArchivePath}")
+ private String cbaArchivePath;
+ private Path cbaLocation;
+
+ @Autowired
+ private CbaFileManagementService cbaFileManagementService;
+
+ @Autowired
+ private CbaToDatabaseService cbaToDatabaseService;
+
+
+ /**
+ * This method would be used by SpringBoot to initialize the cba location
+ */
+ @EventListener(ApplicationReadyEvent.class)
+ private void initCbaService() {
+ this.cbaLocation = BluePrintFileUtils.Companion.getCbaStorageDirectory(cbaArchivePath);
+ log.info("CBA service Initiated...");
+ }
+
+ /**
+ * This is a uploadCBAFile method
+ * take a {@link FilePart}, transfer it to disk using WebFlux and return a {@link Mono} representing the result
+ *
+ * @param filePart - the request part containing the file to be saved
+ * @return a {@link Mono< BlueprintModelResponse >} representing the result of the operation
+ */
+ public Mono<BlueprintModelResponse> uploadCBAFile(FilePart filePart) {
+
+ try {
+ return this.cbaFileManagementService.saveCBAFile(filePart, cbaLocation).map(fileName -> {
+ ConfigModel configModel;
+ BlueprintModelResponse blueprintModelResponse = null;
+
+ try {
+ String cbaDirectory = this.cbaFileManagementService.decompressCBAFile(fileName, cbaLocation);
+ configModel = this.cbaToDatabaseService.storeBluePrints(cbaDirectory, fileName, cbaLocation.resolve(fileName));
+ blueprintModelResponse = new BlueprintModelResponse(configModel.getId(), configModel.getArtifactName(), configModel.getArtifactVersion(), configModel.getArtifactDescription(), configModel.getConfigModelCBA().getCbaUUID());
+ } catch (BluePrintException be) {
+ Mono.error(new BluePrintException("Error loading CBA in database.", be));
+ } finally {
+ try {
+ this.cbaFileManagementService.cleanupSavedCBA(fileName, cbaLocation);
+ } catch (BluePrintException be) {
+ Mono.error(new BluePrintException("Error while cleaning up.", be));
+ }
+ }
+ return blueprintModelResponse;
+ });
+ } catch (IOException | BluePrintException e) {
+ return Mono.error(new BluePrintException("Error uploading the CBA file in channel.", e));
+ }
+ }
+
+ /**
+ * This is a deleteCba method
+ *
+ * @param id id
+ * @throws BluePrintException BluePrintException
+ */
+ public void deleteCBA(@NotNull Long id) throws BluePrintException {
+ this.cbaToDatabaseService.deleteCBA(id);
+ }
+
+ /**
+ * This is a downloadCBAFile method to find the target file to download and return a file ressource using MONO
+ *
+ * @param (id)
+ * @return ResponseEntity<Resource>
+ */
+ public ResponseEntity<Resource> downloadCBAFile(@NotNull String id) {
+ Optional<CbaContent> optionalContent = this.cbaToDatabaseService.findByUUID(id);
+
+ CbaContent cbaContent = optionalContent.get();
+
+ return ResponseEntity.ok()
+ .contentType(MediaType.parseMediaType("text/plain"))
+ .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + cbaContent.getCbaName() + "\"")
+ .body(new ByteArrayResource(cbaContent.getCbaFile()));
+ }
+
+ /**
+ * This is a findCBAByID method to find a CBA By the UUID
+ *
+ * @param (id)
+ * @return ItemCbaResponse
+ */
+ public ItemCbaResponse findCBAByID(@NotNull String id) {
+ ItemCbaResponse response = new ItemCbaResponse();
+ Optional<CbaContent> optionalContent = this.cbaToDatabaseService.findByUUID(id);
+
+ CbaContent cbaContent = optionalContent.get();
+ response.setName(cbaContent.getCbaName());
+ response.setState(cbaContent.getCbaState());
+ response.setId(cbaContent.getCbaUUID());
+ response.setVersion(cbaContent.getCbaVersion());
+ response.setDescription(cbaContent.getCbaDescription());
+ return response;
+ }
+
+ /**
+ * This is a findAllCBA method to retrieve all the CBAs in Database
+ *
+ * @return List<ItemCbaResponse> list with the controller blueprint archives
+ */
+ public List<ItemCbaResponse> findAllCBA() {
+ List<ItemCbaResponse> responseList = new ArrayList<>();
+ List<CbaContent> cbaContents = this.cbaToDatabaseService.listCBAFiles();
+
+ for(CbaContent content: cbaContents){
+ ItemCbaResponse response = new ItemCbaResponse();
+ response.setName(content.getCbaName());
+ response.setState(content.getCbaState());
+ response.setId(content.getCbaUUID());
+ response.setVersion(content.getCbaVersion());
+ response.setDescription(content.getCbaDescription());
+
+ responseList.add(response);
+ }
+ return responseList;
+ }
+
+ /**
+ * This is a findCBAByNameAndVersion method to find a CBA by Name and version
+ *
+ * @param (name, version)
+ * @return
+ * @throws BluePrintException BluePrintException
+ */
+ public ItemCbaResponse findCBAByNameAndVersion(@NotNull String name, @NotNull String version) throws BluePrintException {
+ return null;
+ }
+}
\ No newline at end of file diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaToDatabaseService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaToDatabaseService.java new file mode 100755 index 000000000..34204202d --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/CbaToDatabaseService.java @@ -0,0 +1,132 @@ +/*
+ * Copyright © 2018 IBM Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.service;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.commons.collections.CollectionUtils;
+import org.jetbrains.annotations.NotNull;
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;
+import org.onap.ccsdk.apps.controllerblueprints.service.domain.CbaContent;
+import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModel;
+import org.onap.ccsdk.apps.controllerblueprints.service.repository.ConfigModelContentRepository;
+import org.onap.ccsdk.apps.controllerblueprints.service.repository.ConfigModelRepository;
+import org.onap.ccsdk.apps.controllerblueprints.service.utils.CbaStateEnum;
+import org.onap.ccsdk.apps.controllerblueprints.service.utils.ConfigModelUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * This class acts as a Rest Service that would store in the Database the Blueprints.
+ * @author Ruben Chang
+ */
+
+@Service
+public class CbaToDatabaseService {
+
+ //Log used to trace the transactions using the EELFLogger class
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CbaToDatabaseService.class);
+
+ @Autowired
+ private ConfigModelRepository configModelRepository;
+ @Autowired
+ private ConfigModelContentRepository configModelContentRepository;
+ @Autowired
+ private ConfigModelCreateService configModelCreateService;
+ @Autowired
+ private CBAContentService cbaContentService;
+
+ /**
+ * This method will store the blueprints into the DB on the tables CONFIG_MODEL and CONFIG_MODEL_CONTENT
+ * @param cbaArchiveToSave Path in which the components are stored
+ * @return ConfigModel The Blueprint object stored in the DB
+ */
+ public ConfigModel storeBluePrints(String cbaDirectory, String cbaFileName, Path cbaArchiveToSave) throws BluePrintException {
+ log.info("*************************** storeBluePrints **********************");
+ ConfigModel configModel = null;
+ CbaContent cbaContent;
+ String version = "1.0";//TODO Read these information from metadata
+ String description = "Initial description for CBA archive " + cbaFileName;//TODO
+
+ List<String> serviceTemplateDirs = ConfigModelUtils.getBlueprintNames(cbaDirectory);
+ if (CollectionUtils.isNotEmpty(serviceTemplateDirs)) {
+ for (String fileName : serviceTemplateDirs) {
+ try {
+ String bluePrintPath = cbaDirectory.concat("/").concat(fileName);
+ log.debug("***** Loading service template : {}", bluePrintPath);
+ configModel = ConfigModelUtils.getConfigModel(bluePrintPath);
+
+ configModel = this.configModelCreateService.saveConfigModel(configModel);
+
+ log.info("Loaded service template successfully: {}", fileName);
+ } catch (Exception e) {
+ throw new BluePrintException("Load config model " + fileName + " error : "+e.getMessage());
+ }
+ }
+ } else {
+ throw new BluePrintException("Invalid structure. The unzipped file does not contains Blueprints");
+ }
+
+ byte[] file;
+ try {
+ file = Files.readAllBytes(cbaArchiveToSave);
+ } catch (IOException e) {
+ throw new BluePrintException("Fail to read the CBA to save in database.", e);
+ }
+
+ cbaContent = this.cbaContentService.saveCBAContent(cbaFileName, version, CbaStateEnum.DRAFT.getState(), description, file);
+ configModel.setConfigModelCBA(cbaContent);
+
+ return configModel;
+ }
+
+ /**
+ * This is a deleteConfigModel method
+ *
+ * @param id id
+ * @throws BluePrintException BluePrintException
+ */
+ public void deleteCBA(@NotNull Long id) throws BluePrintException {
+ Optional<ConfigModel> dbConfigModel = configModelRepository.findById(id);
+
+ //TODO: Delete CBA and COnfigModel
+
+ }
+
+ /**
+ * Get a list of the controller blueprint archives
+ * @return List<CbaContent> List with the controller blueprint archives
+ */
+ public List<CbaContent> listCBAFiles() {
+ return this.cbaContentService.getList();
+ }
+
+ /**
+ * Find a Controller Blueprint Archive by UUID
+ * @param uuID the User Identifier Controller Blueprint archive
+ * @return Optional<CbaContent> the Controller Blueprint archive
+ */
+ public Optional<CbaContent> findByUUID(String uuID) {
+ return this.cbaContentService.findByUUID(uuID);
+ }
+}
\ No newline at end of file diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ConfigModelCreateService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ConfigModelCreateService.java index fa8e32b69..f31a0ceb1 100644..100755 --- a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ConfigModelCreateService.java +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ConfigModelCreateService.java @@ -30,6 +30,7 @@ import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant; import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;
import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;
import org.onap.ccsdk.apps.controllerblueprints.service.common.ApplicationConstants;
+import org.onap.ccsdk.apps.controllerblueprints.service.domain.CbaContent;
import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModel;
import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModelContent;
import org.onap.ccsdk.apps.controllerblueprints.service.repository.ConfigModelRepository;
@@ -123,7 +124,7 @@ public class ConfigModelCreateService { String artifactName = configModel.getArtifactName();
String artifactVersion = configModel.getArtifactVersion();
String author = configModel.getUpdatedBy();
-
+ CbaContent configModelCBA = configModel.getConfigModelCBA();
if (StringUtils.isBlank(author)) {
throw new BluePrintException("Artifact Author is missing in the Service Template");
@@ -181,7 +182,7 @@ public class ConfigModelCreateService { addConfigModelContent(dbConfigModelId, configModel);
// Populate Content model types
- updateConfigModel = updateConfigModel(dbConfigModelId, artifactName, artifactVersion, author);
+ updateConfigModel = updateConfigModel(dbConfigModelId, artifactName, artifactVersion, author, configModelCBA);
return updateConfigModel;
@@ -220,7 +221,7 @@ public class ConfigModelCreateService { }
private ConfigModel updateConfigModel(Long dbConfigModelId, String artifactName, String artifactVersion,
- String author) throws BluePrintException {
+ String author, CbaContent configModelCBA) throws BluePrintException {
ConfigModel dbConfigModel = configModelRepository.getOne(dbConfigModelId);
// Populate tags from metadata
@@ -234,6 +235,7 @@ public class ConfigModelCreateService { dbConfigModel.setUpdatedBy(author);
dbConfigModel.setPublished(ApplicationConstants.ACTIVE_N);
dbConfigModel.setTags(tags);
+ dbConfigModel.setConfigModelCBA(configModelCBA);
configModelRepository.saveAndFlush(dbConfigModel);
log.info("Config model ({}) saved successfully.", dbConfigModel.getId());
return dbConfigModel;
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/CbaContent.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/CbaContent.java new file mode 100755 index 000000000..14ac6af1d --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/CbaContent.java @@ -0,0 +1,114 @@ +/* + * Copyright © 2018 IBM Intellectual Property. + * + * 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. + */ + +package org.onap.ccsdk.apps.controllerblueprints.service.domain; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import org.hibernate.annotations.Proxy; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * CbaContent.java Purpose: Provide Configuration Generator for CbaContent Entity + * + * @author Ruben Chang + * @version 1.0 + */ + +@EntityListeners({AuditingEntityListener.class}) +@Entity +@Table(name = "CBA_CONTENT") +@Proxy(lazy=false) +public class CbaContent implements Serializable { + + private static final long serialVersionUID = 1L; + + public CbaContent() { + this.cbaUUID = UUID.randomUUID().toString(); + } + + @Id + @Column(name = "cba_uuid", nullable = false) + private String cbaUUID; + + @Lob + @Column(name = "cba_file") + private byte[] cbaFile; + + @Column(name = "cba_name") + private String cbaName; + + @Column(name = "cba_version") + private String cbaVersion; + + @Column(name = "cba_state") + private int cbaState; + + @Column(name="cba_description") + private String cbaDescription; + + @OneToMany(mappedBy = "configModelCBA", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL) + @JsonManagedReference + private List<ConfigModel> models = new ArrayList<>(); + + public String getCbaUUID() { + return cbaUUID; + } + + public void setCbaUUID(String cbaUUID) { + this.cbaUUID = cbaUUID; + } + + public String getCbaName() { + return cbaName; + } + + public void setCbaName(String cbaName) { + this.cbaName = cbaName; + } + + public String getCbaVersion() { + return cbaVersion; + } + + public void setCbaVersion(String cbaVersion) { + this.cbaVersion = cbaVersion; + } + + public List<ConfigModel> getModels() { + return models; + } + + public void setModels(List<ConfigModel> models) { this.models = models; } + + public int getCbaState() { return cbaState; } + + public void setCbaState(int cbaState) { this.cbaState = cbaState; } + + public String getCbaDescription() { return cbaDescription; } + + public void setCbaDescription(String cbaDescription) { this.cbaDescription = cbaDescription; } + + public byte[] getCbaFile() { return cbaFile; } + + public void setCbaFile(byte[] cbaFile) { this.cbaFile = cbaFile; } + +} diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/ConfigModel.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/ConfigModel.java index 51c9a7c6a..dea5757d2 100644..100755 --- a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/ConfigModel.java +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/domain/ConfigModel.java @@ -119,6 +119,10 @@ public class ConfigModel implements Serializable { @JsonManagedReference
private List<ConfigModelContent> configModelContents = new ArrayList<>();
+ @ManyToOne
+ @JoinColumn(name = "cba_content_uuid")
+ private CbaContent configModelCBA;
+
public Long getId() {
return id;
}
@@ -287,4 +291,12 @@ public class ConfigModel implements Serializable { this.configModelContents = configModelContents;
}
+ public CbaContent getConfigModelCBA() {
+ return configModelCBA;
+ }
+
+ public void setConfigModelCBA(CbaContent configModelCBA) {
+ this.configModelCBA = configModelCBA;
+ }
+
}
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/BlueprintModelResponse.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/BlueprintModelResponse.java new file mode 100755 index 000000000..1b67ed823 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/BlueprintModelResponse.java @@ -0,0 +1,78 @@ +/*
+ * Copyright © 2018 IBM Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.service.model;
+
+/**
+ * BlueprintModelResponse.java Purpose: Model response for Upload CBA service
+ *
+ */
+public class BlueprintModelResponse {
+ private Long id;
+ private String name;
+ private String version;
+ private String description;
+ private String cbaUUID;
+
+ public BlueprintModelResponse(Long id, String name, String version, String description, String cbaUUID) {
+ this.id = id;
+ this.name = name;
+ this.version = version;
+ this.description = description;
+ this.cbaUUID = cbaUUID;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getCbaUUID() {
+ return cbaUUID;
+ }
+
+ public void setCbaUUID(String cbaUUID) {
+ this.cbaUUID = cbaUUID;
+ }
+}
\ No newline at end of file diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/ItemCbaResponse.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/ItemCbaResponse.java new file mode 100755 index 000000000..0752df9b6 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/model/ItemCbaResponse.java @@ -0,0 +1,58 @@ +package org.onap.ccsdk.apps.controllerblueprints.service.model; + +/** + * CLass that would represent the response for the GET methods on the CBAService class + */ +public class ItemCbaResponse { + + private String id; + private String description; + private String name; + private int state; + private String version; + + public ItemCbaResponse() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + +} diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/repository/CBAContentRepository.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/repository/CBAContentRepository.java new file mode 100755 index 000000000..273a19d66 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/repository/CBAContentRepository.java @@ -0,0 +1,59 @@ +/* + * Copyright © 2018 IBM Intellectual Property. + * + * 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. + */ + +package org.onap.ccsdk.apps.controllerblueprints.service.repository; + +import org.jetbrains.annotations.NotNull; +import org.onap.ccsdk.apps.controllerblueprints.service.domain.CbaContent; +import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModel; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * CBAContentRepository.java Purpose: Provide Configuration Generator CRUD methods for CBAContent table + * + * @author Ruben Chang + * @version 1.0 + */ +@Repository +public interface CBAContentRepository extends JpaRepository<CbaContent, String> { + + /** + * This is a findAll method + * @return List<CbaContent> + */ + @Override + List<CbaContent> findAll(); + + /** + * Returns a CbaContent based on the cbaUUID + * @param cbaUUID the CbaUUID + * @return Optional<CbaContent> + */ + @Override + @NotNull + Optional<CbaContent> findById(@NotNull String cbaUUID); + + /** + * This is a deleteById methid + * @param cbaUUID the user ID for a particular CBAFile + */ + @Override + void deleteById(@NotNull String cbaUUID); +} diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/rs/CbaRest.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/rs/CbaRest.java new file mode 100755 index 000000000..4608b1755 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/rs/CbaRest.java @@ -0,0 +1,84 @@ +/*
+ * Copyright © 2018 IBM Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.service.rs;
+
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;
+import org.onap.ccsdk.apps.controllerblueprints.service.CbaService;
+import org.onap.ccsdk.apps.controllerblueprints.service.model.BlueprintModelResponse;
+import org.onap.ccsdk.apps.controllerblueprints.service.model.ItemCbaResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.codec.multipart.FilePart;
+import org.springframework.http.codec.multipart.Part;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Flux;
+
+import java.util.List;
+
+/**
+ * CbaRest.java Purpose: Provide a REST API to upload single and multiple CBA
+ *
+ * @author Steve Siani
+ * @version 1.0
+ */
+@RestController
+@RequestMapping(value = "/api/v1/cba")
+public class CbaRest {
+
+ @Autowired
+ private CbaService cbaService;
+
+ @PostMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public Flux<BlueprintModelResponse> uploadCBA(@RequestBody Flux<Part> parts) {
+ return parts.filter(part -> part instanceof FilePart) // only retain file parts
+ .ofType(FilePart.class) // convert the flux to FilePart
+ .flatMap(filePart -> cbaService.uploadCBAFile(filePart)); // save each file and flatmap it to a flux of results
+ }
+
+ @DeleteMapping(path = "/{id}")
+ public void deleteCBA(@PathVariable(value = "id") Long id) throws BluePrintException {
+ this.cbaService.deleteCBA(id);
+ }
+
+ @GetMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public @ResponseBody
+ ItemCbaResponse getCBA(@PathVariable(value = "id") String id) {
+ return this.cbaService.findCBAByID(id);
+ }
+
+ @GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public @ResponseBody
+ List<ItemCbaResponse> getAllCBA() {
+ return this.cbaService.findAllCBA();
+ }
+
+ @GetMapping(path = "/by-name/{name}/version/{version}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public @ResponseBody
+ ItemCbaResponse getCBAByNameAndVersion(@PathVariable(value = "name") String name,
+ @PathVariable(value = "version") String version) throws BluePrintException {
+ return this.cbaService.findCBAByNameAndVersion(name, version);
+ }
+
+ @GetMapping(path = "/download/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public @ResponseBody
+ ResponseEntity<Resource> downloadCBA(@PathVariable(value = "id") String id) {
+ return this.cbaService.downloadCBAFile(id);
+ }
+}
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CbaStateEnum.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CbaStateEnum.java new file mode 100755 index 000000000..57785dd8c --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CbaStateEnum.java @@ -0,0 +1,15 @@ +package org.onap.ccsdk.apps.controllerblueprints.service.utils; + +public enum CbaStateEnum { + + DRAFT(0), VALIDATED(1), APPROVED(2); + int state; + + CbaStateEnum(int state) { + this.state = state; + } + + public int getState() { + return state; + } +} diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CloseCondition.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CloseCondition.java new file mode 100755 index 000000000..d7b4aa938 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/utils/CloseCondition.java @@ -0,0 +1,36 @@ +package org.onap.ccsdk.apps.controllerblueprints.service.utils;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CloseCondition {
+
+ AtomicInteger tasksSubmitted = new AtomicInteger(0);
+ AtomicInteger tasksCompleted = new AtomicInteger(0);
+ AtomicBoolean allTaskssubmitted = new AtomicBoolean(false);
+
+ /**
+ * notify all tasks have been subitted, determine of the file channel can be closed
+ * @return true if the asynchronous file stream can be closed
+ */
+ public boolean canCloseOnComplete() {
+ allTaskssubmitted.set(true);
+ return tasksCompleted.get() == tasksSubmitted.get();
+ }
+
+ /**
+ * notify a task has been submitted
+ */
+ public void onTaskSubmitted() {
+ tasksSubmitted.incrementAndGet();
+ }
+
+ /**
+ * notify a task has been completed
+ * @return true if the asynchronous file stream can be closed
+ */
+ public boolean onTaskCompleted() {
+ boolean allSubmittedClosed = tasksSubmitted.get() == tasksCompleted.incrementAndGet();
+ return allSubmittedClosed && allTaskssubmitted.get();
+ }
+}
|