diff options
59 files changed, 3265 insertions, 314 deletions
diff --git a/mod/bpgenerator/pom.xml b/mod/bpgenerator/pom.xml index 96ceb41..aaf9713 100644 --- a/mod/bpgenerator/pom.xml +++ b/mod/bpgenerator/pom.xml @@ -29,17 +29,12 @@ </parent> <groupId>org.onap.dcaegen2.platform.mod</groupId> <artifactId>blueprint-generator</artifactId> - <version>1.4.0-SNAPSHOT</version> + <version>1.5.1-SNAPSHOT</version> <properties> - <maven.compiler.source>1.6</maven.compiler.source> - <maven.compiler.target>1.6</maven.compiler.target> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <sonar.core.codeCoveragePlugin>cobertura</sonar.core.codeCoveragePlugin> - <sonar.java.coveragePlugin>cobertura</sonar.java.coveragePlugin> <sonar.junit.reportsPath>${project.basedir}/target/surefire-reports</sonar.junit.reportsPath> <sonar.surefire.reportsPath>${project.basedir}/target/surefire-reports</sonar.surefire.reportsPath> - <sonar.cobertura.reportPaths>${project.basedir}/target/site/cobertura/coverage.xml</sonar.cobertura.reportPaths> + <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco-ut/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths> <shade.main>org.onap.blueprintgenerator.core.App</shade.main> <shade.transformer>org.apache.maven.plugins.shade.resource.ManifestResourceTransformer</shade.transformer> </properties> @@ -70,47 +65,6 @@ </plugin> <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>cobertura-maven-plugin</artifactId> - <version>2.7</version> - <configuration> - <instrumentation> - <includes> - <include>**/*.class</include> - </includes> - </instrumentation> - <encoding>UTF-8</encoding> - </configuration> - - <executions> - - <execution> - <id>clean</id> - <!-- > <phase>pre-site</phase> --> - <phase>pre-site</phase> - <goals> - <goal>cobertura</goal> - </goals> - </execution> - - - <execution> - <id>instrument</id> - <phase>site</phase> - <goals> - <goal>instrument</goal> - <goal>cobertura</goal> - </goals> - <configuration> - <encoding>UTF-8</encoding> - </configuration> - </execution> - - </executions> - - </plugin> - - <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.0.2</version> @@ -141,31 +95,13 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> - <source>8</source> - <target>8</target> + <source>11</source> + <target>11</target> </configuration> </plugin> </plugins> - </build> - <reporting> - <plugins> - <plugin> - <!-- use mvn cobertura:cobertura to generate cobertura reports --> - <groupId>org.codehaus.mojo</groupId> - <artifactId>cobertura-maven-plugin</artifactId> - <version>2.7</version> - <configuration> - <formats> - <format>xml</format> - </formats> - </configuration> - </plugin> - </plugins> - </reporting> - - <dependencies> <dependency> <groupId>junit</groupId> diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/common/blueprint/BlueprintHelper.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/common/blueprint/BlueprintHelper.java index 16eca51..451988f 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/common/blueprint/BlueprintHelper.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/common/blueprint/BlueprintHelper.java @@ -34,4 +34,8 @@ public class BlueprintHelper { inputMap.put("default", defaultValue); return inputMap; } + + public static String joinUnderscore(String firstValue, String secondValue){ + return firstValue + "_" + secondValue; + } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Appconfig.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Appconfig.java index b39a8ec..75864be 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Appconfig.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Appconfig.java @@ -52,8 +52,7 @@ public class Appconfig { public TreeMap<String, LinkedHashMap<String, Object>> createAppconfig(TreeMap<String, LinkedHashMap<String, Object>> inps, ComponentSpec cs, String override, boolean isDmaap) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - retInputs = inps; + TreeMap<String, LinkedHashMap<String, Object>> retInputs = inps; //set service calls CallsObj[] call = new CallsObj[0]; @@ -83,7 +82,7 @@ public class Appconfig { } //set the stream publishes - TreeMap<String, DmaapObj> streamSubscribes = new TreeMap<String, DmaapObj>(); + TreeMap<String, DmaapObj> streamSubscribes = new TreeMap<>(); if(cs.getStreams().getSubscribes().length != 0) { for(Subscribes s: cs.getStreams().getSubscribes()) { @@ -110,7 +109,7 @@ public class Appconfig { this.setStreams_subscribes(streamSubscribes); //set the parameters into the appconfig - TreeMap<String, Object> parameters = new TreeMap<String, Object>(); + TreeMap<String, Object> parameters = new TreeMap<>(); for(Parameters p: cs.getParameters()) { String pName = p.getName(); if(p.isSourced_at_deployment()) { @@ -119,17 +118,17 @@ public class Appconfig { parameters.put(pName, paramInput); if(!p.getValue().equals("")) { - LinkedHashMap<String, Object> inputs = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> inputs = new LinkedHashMap<>(); inputs.put("type", "string"); inputs.put("default", p.getValue()); retInputs.put(pName, inputs); } else { - LinkedHashMap<String, Object> inputs = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> inputs = new LinkedHashMap<>(); inputs.put("type", "string"); retInputs.put(pName, inputs); } } else { - if(p.getType() == "string") { + if("string".equals(p.getType())) { String val =(String) p.getValue(); val = '"' + val + '"'; parameters.put(pName, val); @@ -143,7 +142,7 @@ public class Appconfig { GetInput ov = new GetInput(); ov.setBpInputName("service_component_name_override"); parameters.put("service_component_name_override", ov); - LinkedHashMap<String, Object> over = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> over = new LinkedHashMap<>(); over.put("type", "string"); over.put("default", override); retInputs.put("service_component_name_override", over); diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Blueprint.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Blueprint.java index c043a9e..f2ef7aa 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Blueprint.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Blueprint.java @@ -20,35 +20,27 @@ package org.onap.blueprintgenerator.models.blueprint; -import java.io.*; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.TreeMap; import java.util.regex.Pattern; - +import lombok.Getter; +import lombok.Setter; import org.onap.blueprintgenerator.core.Fixes; import org.onap.blueprintgenerator.models.componentspec.ComponentSpec; -import org.onap.blueprintgenerator.models.componentspec.Parameters; -import org.onap.blueprintgenerator.models.componentspec.Publishes; -import org.onap.blueprintgenerator.models.componentspec.Subscribes; import org.onap.blueprintgenerator.models.dmaapbp.DmaapBlueprint; import org.onap.blueprintgenerator.models.onapbp.OnapBlueprint; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -//import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.yaml.snakeyaml.Yaml; - - @Getter @Setter @JsonInclude(JsonInclude.Include.NON_NULL) @@ -100,93 +92,43 @@ public class Blueprint { public void blueprintToYaml(String outputPath, String bluePrintName, ComponentSpec cs) { File outputFile; - - if(bluePrintName.equals("")) { - String name = cs.getSelf().getName(); - if(name.contains(".")) { - name = name.replaceAll(Pattern.quote("."), "_"); - } - if(name.contains(" ")) { - name = name.replaceAll(" ", ""); - } - String file = name + ".yaml"; - - - outputFile = new File(outputPath, file); - outputFile.getParentFile().mkdirs(); - try { - outputFile.createNewFile(); - } catch (IOException e) { - - throw new RuntimeException(e); - } - } else { - if(bluePrintName.contains(" ") || bluePrintName.contains(".")) { - bluePrintName = bluePrintName.replaceAll(Pattern.quote("."), "_"); - bluePrintName = bluePrintName.replaceAll(" ", ""); - } - String file = bluePrintName + ".yaml"; - outputFile = new File(outputPath, file); - outputFile.getParentFile().mkdirs(); - try { - outputFile.createNewFile(); - } catch (IOException e) { - throw new RuntimeException(e); - } + String name = bluePrintName.equals("") ? cs.getSelf().getName() : bluePrintName; + if(name.contains(".")) { + name = name.replaceAll(Pattern.quote("."), "_"); + } + if(name.contains(" ")) { + name = name.replaceAll(" ", ""); + } + String file = name + ".yaml"; + outputFile = new File(outputPath, file); + outputFile.getParentFile().mkdirs(); + try { + outputFile.createNewFile(); + } catch (IOException e) { + throw new RuntimeException(e); } String version = "#blueprint_version: " + cs.getSelf().getVersion() + '\n'; String description = "#description: " + cs.getSelf().getDescription() + '\n'; - BufferedWriter writer = null; - try { - writer = new BufferedWriter(new FileWriter(outputFile, false)); + try(BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile, false))) { + writer.write(description); + writer.write(version); } catch (IOException e1) { throw new RuntimeException(e1); } - if(writer != null) { - try { - writer.write(description); - } catch (IOException e) { - throw new RuntimeException(e); - } - try { - writer.write(version); - } catch (IOException e) { - throw new RuntimeException(e); - } - try { - writer.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - //read the translated blueprint into the file ObjectMapper blueprintMapper = new ObjectMapper(new YAMLFactory().configure(YAMLGenerator.Feature.MINIMIZE_QUOTES, true)); - PrintWriter out = null; - try { - out = new PrintWriter(new BufferedWriter(new FileWriter(outputFile, true))); + try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(outputFile, true)))) { + blueprintMapper.writeValue(out, this); } catch (IOException e) { throw new RuntimeException(e); } try { - if(out != null) { - blueprintMapper.writeValue(out, this); - out.close(); - } - } catch (IOException e) { - - throw new RuntimeException(e); - } - - - Fixes fix = new Fixes(); - try { - fix.fixSingleQuotes(outputFile); + Fixes.fixSingleQuotes(outputFile); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Imports.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Imports.java index b17b045..139790a 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Imports.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Imports.java @@ -21,21 +21,16 @@ package org.onap.blueprintgenerator.models.blueprint; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; -import lombok.AllArgsConstructor; -import lombok.Getter; import lombok.Setter; -import lombok.NoArgsConstructor; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import lombok.Getter; +import lombok.Setter; diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Interfaces.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Interfaces.java index a3404f6..435059e 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Interfaces.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Interfaces.java @@ -31,11 +31,9 @@ import lombok.Getter; import lombok.Setter; public class Interfaces { private Start start; public TreeMap<String, LinkedHashMap<String, Object>> createInterface(TreeMap<String, LinkedHashMap<String, Object>> inps, ComponentSpec cs){ - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - retInputs = inps; //create the start object Start start = new Start(); - retInputs = start.createOnapStart(retInputs, cs); + TreeMap<String, LinkedHashMap<String, Object>> retInputs = start.createOnapStart(inps, cs); this.setStart(start); return retInputs; } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java index d32d6f4..6edbe5c 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java @@ -47,6 +47,8 @@ import org.onap.blueprintgenerator.models.dmaapbp.DmaapStreams; @JsonInclude(value = Include.NON_NULL) public class Properties { + ArrayList<DmaapStreams> streams_publishes; + ArrayList<DmaapStreams> streams_subscribes; private Appconfig application_config; private Auxilary docker_config; private Object image; @@ -58,8 +60,6 @@ public class Properties { private String name; private GetInput topic_name; private GetInput feed_name; - ArrayList<DmaapStreams> streams_publishes; - ArrayList<DmaapStreams> streams_subscribes; private TlsInfo tls_info; private ExternalTlsInfo external_cert; private ResourceConfig resource_config; @@ -155,8 +155,7 @@ public class Properties { public TreeMap<String, LinkedHashMap<String, Object>> createDmaapProperties( TreeMap<String, LinkedHashMap<String, Object>> inps, ComponentSpec cs, String override) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - retInputs = inps; + TreeMap<String, LinkedHashMap<String, Object>> retInputs = inps; //set the image GetInput image = new GetInput(); @@ -171,7 +170,7 @@ public class Properties { GetInput location = new GetInput(); location.setBpInputName("location_id"); this.setLocation_id(location); - LinkedHashMap<String, Object> locMap = new LinkedHashMap(); + LinkedHashMap<String, Object> locMap = new LinkedHashMap<>(); locMap.put("type", "string"); locMap.put("default", ""); retInputs.put("location_id", locMap); @@ -219,7 +218,7 @@ public class Properties { this.setApplication_config(app); //set the stream publishes - ArrayList<DmaapStreams> pubStreams = new ArrayList(); + ArrayList<DmaapStreams> pubStreams = new ArrayList<>(); if (cs.getStreams().getPublishes() != null) { for (Publishes p : cs.getStreams().getPublishes()) { if (p.getType().equals("message_router") || p.getType().equals("message router")) { @@ -239,7 +238,7 @@ public class Properties { } //set the stream subscribes - ArrayList<DmaapStreams> subStreams = new ArrayList(); + ArrayList<DmaapStreams> subStreams = new ArrayList<>(); if (cs.getStreams().getSubscribes() != null) { for (Subscribes s : cs.getStreams().getSubscribes()) { if (s.getType().equals("message_router") || s.getType().equals("message router")) { @@ -258,10 +257,10 @@ public class Properties { } } - if (pubStreams.size() != 0) { + if (!pubStreams.isEmpty()) { this.setStreams_publishes(pubStreams); } - if (subStreams.size() != 0) { + if (!subStreams.isEmpty()) { this.setStreams_subscribes(subStreams); } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ResourceConfig.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ResourceConfig.java index 13aa0d0..6595a67 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ResourceConfig.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ResourceConfig.java @@ -71,13 +71,12 @@ public class ResourceConfig { * @return the tree map */ public TreeMap<String, LinkedHashMap<String, Object>> createResourceConfig(TreeMap<String, LinkedHashMap<String, Object>> inps, String name){ - TreeMap<String, LinkedHashMap<String, Object>> retInputs = inps; - LinkedHashMap<String, Object> mi = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> mi = new LinkedHashMap<>(); mi.put("type", "string"); mi.put("default", "128Mi"); - LinkedHashMap<String, Object> m = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> m = new LinkedHashMap<>(); m.put("type", "string"); m.put("default", "250m"); @@ -87,7 +86,7 @@ public class ResourceConfig { } //set the limits - TreeMap<String, GetInput> lim = new TreeMap<String, GetInput>(); + TreeMap<String, GetInput> lim = new TreeMap<>(); GetInput cpu = new GetInput(); cpu.setBpInputName(name + "cpu_limit"); @@ -97,13 +96,13 @@ public class ResourceConfig { memL.setBpInputName(name + "memory_limit"); lim.put("memory", memL); - retInputs.put(name + "cpu_limit", m); - retInputs.put(name + "memory_limit", mi); + inps.put(name + "cpu_limit", m); + inps.put(name + "memory_limit", mi); this.setLimits(lim); //set the requests - TreeMap<String, GetInput> req = new TreeMap<String, GetInput>(); + TreeMap<String, GetInput> req = new TreeMap<>(); GetInput cpuR = new GetInput(); cpuR.setBpInputName(name + "cpu_request"); @@ -113,12 +112,12 @@ public class ResourceConfig { memR.setBpInputName(name + "memory_request"); req.put("memory", memR); - retInputs.put(name + "cpu_request", m); - retInputs.put(name + "memory_request", mi); + inps.put(name + "cpu_request", m); + inps.put(name + "memory_request", mi); this.setRequests(req); - return retInputs; + return inps; } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Start.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Start.java index d9c885d..0b03777 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Start.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Start.java @@ -36,14 +36,12 @@ public class Start { private LinkedHashMap<String, Object> envs; public TreeMap<String, LinkedHashMap<String, Object>> createOnapStart(TreeMap<String, LinkedHashMap<String, Object>> inps, ComponentSpec cs) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = inps; - retInputs = inps; - + //create the start inputs StartInputs inputs = new StartInputs(); - inputs.createOnapStartInputs(retInputs, cs); + inputs.createOnapStartInputs(inps, cs); this.setInputs(inputs); - return retInputs; + return inps; } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/StartInputs.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/StartInputs.java index 1055fbd..a0cfe20 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/StartInputs.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/StartInputs.java @@ -41,10 +41,9 @@ public class StartInputs { private Object envs; public TreeMap<String, LinkedHashMap<String, Object>> createOnapStartInputs(TreeMap<String, LinkedHashMap<String, Object>> inps, ComponentSpec cs){ - TreeMap<String, LinkedHashMap<String, Object>> retInputs = inps; int count = 0; - ArrayList<String> portList = new ArrayList(); + ArrayList<String> portList = new ArrayList<>(); Auxilary aux = cs.getAuxilary(); if (aux.getPorts() != null) { @@ -56,10 +55,10 @@ public class StartInputs { , ports[0], count); portList.add(internal); - LinkedHashMap<String, Object> portType = new LinkedHashMap(); + LinkedHashMap<String, Object> portType = new LinkedHashMap<>(); portType.put("type", "string"); portType.put("default", ports[1]); - retInputs.put("external_port_" + count, portType); + inps.put("external_port_" + count, portType); count++; } @@ -98,7 +97,7 @@ public class StartInputs { // } //set the envs - LinkedHashMap<String, Object> eMap = new LinkedHashMap(); + LinkedHashMap<String, Object> eMap = new LinkedHashMap<>(); if(cs.getAuxilary().getDatabases() != null){ //set db env variables LinkedHashMap<String, Object> envVars = PgaasNodeBuilder.getEnvVariables(cs.getAuxilary().getDatabases()); @@ -111,9 +110,9 @@ public class StartInputs { this.setEnvs(env); eMap.put("default", "{}"); } - retInputs.put("envs", eMap); + inps.put("envs", eMap); - return retInputs; + return inps; } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapInfo.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapInfo.java index 464fc4a..0cec284 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapInfo.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapInfo.java @@ -46,9 +46,7 @@ public class DmaapInfo { public TreeMap<String, LinkedHashMap<String, Object>> createOnapDmaapMRInfo( TreeMap<String, LinkedHashMap<String, Object>> inps, String config, char type) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - retInputs = inps; - LinkedHashMap<String, Object> stringType = new LinkedHashMap<String, Object>(); + LinkedHashMap<String, Object> stringType = new LinkedHashMap<>(); stringType.put("type", "string"); config = config.replaceAll("-", "_"); @@ -62,9 +60,9 @@ public class DmaapInfo { topic.setBpInputName(config); this.setTopic_url(topic); - retInputs.put(config, stringType); + inps.put(config, stringType); - return retInputs; + return inps; } public TreeMap<String, LinkedHashMap<String, Object>> createOnapDmaapDRInfo( diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapObj.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapObj.java index 6af69e5..30f59e2 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapObj.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/dmaap/DmaapObj.java @@ -40,10 +40,8 @@ public class DmaapObj { public TreeMap<String, LinkedHashMap<String, Object>> createOnapDmaapMRObj(TreeMap<String, LinkedHashMap<String, Object>> inps, String config, char type, String n, String num, boolean isDmaap) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - LinkedHashMap<String, Object> stringType = new LinkedHashMap(); + LinkedHashMap<String, Object> stringType = new LinkedHashMap<>(); stringType.put("type", "string"); - retInputs = inps; //set the dmaapinfo DmaapInfo info = new DmaapInfo(); @@ -58,20 +56,18 @@ public class DmaapObj { GetInput u = new GetInput(); u.setBpInputName(config + "_" + num +"_aaf_username"); this.setUser(u); - retInputs.put(config + "_" + num +"_aaf_username", stringType); + inps.put(config + "_" + num +"_aaf_username", stringType); //set password GetInput p = new GetInput(); p.setBpInputName(config + "_" + num +"_aaf_password"); this.setPass(p); - retInputs.put(config + "_" + num +"_aaf_password", stringType); + inps.put(config + "_" + num +"_aaf_password", stringType); } - return retInputs; + return inps; } public TreeMap<String, LinkedHashMap<String, Object>> createOnapDmaapDRObj(TreeMap<String, LinkedHashMap<String, Object>> inps, String config, char type, String n, String num, boolean isDmaap) { - TreeMap<String, LinkedHashMap<String, Object>> retInputs = new TreeMap<String, LinkedHashMap<String, Object>>(); - retInputs = inps; - + //set the dmaapinfo DmaapInfo info = new DmaapInfo(); if(!isDmaap){ @@ -82,6 +78,6 @@ public class DmaapObj { String infoType = "<<" + n + ">>"; this.setDmaap_info(infoType); } - return retInputs; + return inps; } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java index c4cc663..2774abb 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java @@ -1,4 +1,4 @@ -/**============LICENSE_START======================================================= +/*============LICENSE_START======================================================= org.onap.dcae ================================================================================ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. @@ -8,16 +8,16 @@ 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.blueprintgenerator.models.dmaapbp; @@ -28,92 +28,103 @@ import java.util.TreeMap; import org.onap.blueprintgenerator.core.PgaasNodeBuilder; import org.onap.blueprintgenerator.core.PolicyNodeBuilder; import org.onap.blueprintgenerator.models.blueprint.Blueprint; -import org.onap.blueprintgenerator.models.blueprint.Imports; import org.onap.blueprintgenerator.models.blueprint.Node; import org.onap.blueprintgenerator.models.componentspec.ComponentSpec; import org.onap.blueprintgenerator.models.componentspec.Publishes; import org.onap.blueprintgenerator.models.componentspec.Subscribes; -public class DmaapBlueprint extends Blueprint{ - public Blueprint createDmaapBlueprint(ComponentSpec cs, String importPath, String override) { - Blueprint bp = new Blueprint(); - - //set tosca definition - bp.setTosca_definitions_version("cloudify_dsl_1_3"); - - //set the description - bp.setDescription(cs.getSelf().getDescription()); - - //create the inpus object that will be added to over the creation of the blueprint - TreeMap<String, LinkedHashMap<String, Object>> inps = new TreeMap<String, LinkedHashMap<String, Object>>(); - - //set the imports - Imports imps = new Imports(); - if(importPath.equals("")) { - bp.setImports(imps.createDmaapImports()); - } - else { - bp.setImports(imps.createImportsFromFile(importPath)); - } - - //bp.setImports(imps.getImports()); - - //set and create the node templates - TreeMap<String, Node> nodeTemplate = new TreeMap(); - - //create and add the main dmaap node - DmaapNode dmaap = new DmaapNode(); - inps = dmaap.createDmaapNode(cs, inps, override); - nodeTemplate.put(cs.getSelf().getName(), dmaap); - - //create and add the topic/feed nodes - - //go through the streams publishes - if(cs.getStreams().getPublishes() != null) { - for(Publishes p: cs.getStreams().getPublishes()) { - if(p.getType().equals("message_router") || p.getType().equals("message router")) { - String topic = p.getConfig_key() + "_topic"; - DmaapNode topicNode = new DmaapNode(); - inps = topicNode.createTopicNode(cs, inps, topic); - nodeTemplate.put(topic, topicNode); - } else if(p.getType().equals("data_router") || p.getType().equals("data router")) { - String feed = p.getConfig_key() + "_feed"; - DmaapNode feedNode = new DmaapNode(); - inps = feedNode.createFeedNode(cs, inps, feed); - nodeTemplate.put(feed, feedNode); - } - } - } - //go through the stream subscribes - if(cs.getStreams().getSubscribes() != null) { - for(Subscribes s: cs.getStreams().getSubscribes()) { - if(s.getType().equals("message_router") || s.getType().equals("message router")) { - String topic = s.getConfig_key() + "_topic"; - DmaapNode topicNode = new DmaapNode(); - inps = topicNode.createTopicNode(cs, inps, topic); - nodeTemplate.put(topic, topicNode); - } else if(s.getType().equals("data_router") || s.getType().equals("data router")) { - String feed = s.getConfig_key() + "_feed"; - DmaapNode feedNode = new DmaapNode(); - inps = feedNode.createFeedNode(cs, inps, feed); - nodeTemplate.put(feed, feedNode); - } - } - } - - //if present in component spec, populate policyNodes information in the blueprint - if(cs.getPolicyInfo() != null){ - PolicyNodeBuilder.addPolicyNodesAndInputs(cs, nodeTemplate, inps); - } - - //if present in component spec, populate pgaasNodes information in the blueprint - if(cs.getAuxilary().getDatabases() != null){ - PgaasNodeBuilder.addPgaasNodesAndInputs(cs, nodeTemplate, inps); - } - - bp.setNode_templates(nodeTemplate); - - bp.setInputs(inps); - return bp; - } +import static org.onap.blueprintgenerator.common.blueprint.BlueprintHelper.joinUnderscore; +import static org.onap.blueprintgenerator.models.blueprint.Imports.createDmaapImports; +import static org.onap.blueprintgenerator.models.blueprint.Imports.createImportsFromFile; + +public class DmaapBlueprint extends Blueprint { + + private static final String TOPIC = "topic"; + private static final String FEED = "feed"; + + public Blueprint createDmaapBlueprint(ComponentSpec componentSpec, String importPath, String override) { + Blueprint blueprint = new Blueprint(); + + //set tosca definition + blueprint.setTosca_definitions_version("cloudify_dsl_1_3"); + + //set the description + blueprint.setDescription(componentSpec.getSelf().getDescription()); + + //create the inpus object that will be added to over the creation of the blueprint + TreeMap<String, LinkedHashMap<String, Object>> inps = new TreeMap<>(); + + //set the imports + if (importPath.equals("")) { + blueprint.setImports(createDmaapImports()); + } else { + blueprint.setImports(createImportsFromFile(importPath)); + } + + //set and create the node templates + TreeMap<String, Node> nodeTemplate = new TreeMap(); + + //create and add the main dmaap node + DmaapNode dmaap = new DmaapNode(); + inps = dmaap.createDmaapNode(componentSpec, inps, override); + nodeTemplate.put(componentSpec.getSelf().getName(), dmaap); + + //create and add the topic/feed nodes + + //go through the streams publishes + if (componentSpec.getStreams().getPublishes() != null) { + for (Publishes publisher : componentSpec.getStreams().getPublishes()) { + if (isMessageRouter(publisher.getType())) { + String topic = joinUnderscore(publisher.getConfig_key(), TOPIC); + DmaapNode topicNode = new DmaapNode(); + inps = topicNode.createTopicNode(componentSpec, inps, topic); + nodeTemplate.put(topic, topicNode); + } else if (isDataRouter(publisher.getType())) { + String feed = joinUnderscore(publisher.getConfig_key(), FEED); + DmaapNode feedNode = new DmaapNode(); + inps = feedNode.createFeedNode(componentSpec, inps, feed); + nodeTemplate.put(feed, feedNode); + } + } + } + //go through the stream subscribes + if (componentSpec.getStreams().getSubscribes() != null) { + for (Subscribes subscriber : componentSpec.getStreams().getSubscribes()) { + if (isMessageRouter(subscriber.getType())) { + String topic = joinUnderscore(subscriber.getConfig_key(), TOPIC); + DmaapNode topicNode = new DmaapNode(); + inps = topicNode.createTopicNode(componentSpec, inps, topic); + nodeTemplate.put(topic, topicNode); + } else if (isDataRouter(subscriber.getType())) { + String feed = joinUnderscore(subscriber.getConfig_key(), FEED); + DmaapNode feedNode = new DmaapNode(); + inps = feedNode.createFeedNode(componentSpec, inps, feed); + nodeTemplate.put(feed, feedNode); + } + } + } + + //if present in component spec, populate policyNodes information in the blueprint + if (componentSpec.getPolicyInfo() != null) { + PolicyNodeBuilder.addPolicyNodesAndInputs(componentSpec, nodeTemplate, inps); + } + + //if present in component spec, populate pgaasNodes information in the blueprint + if (componentSpec.getAuxilary().getDatabases() != null) { + PgaasNodeBuilder.addPgaasNodesAndInputs(componentSpec, nodeTemplate, inps); + } + + blueprint.setNode_templates(nodeTemplate); + + blueprint.setInputs(inps); + return blueprint; + } + + private boolean isDataRouter(String type) { + return type.equals("data_router") || type.equals("data router"); + } + + private boolean isMessageRouter(String type) { + return type.equals("message_router") || type.equals("message router"); + } } diff --git a/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprintTest.java b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprintTest.java new file mode 100644 index 0000000..820082e --- /dev/null +++ b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprintTest.java @@ -0,0 +1,244 @@ +/*============LICENSE_START======================================================= + org.onap.dcae + ================================================================================ + Copyright (c) 2020 Nokia. 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.blueprintgenerator.models.dmaapbp; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + + +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.onap.blueprintgenerator.models.blueprint.Blueprint; +import org.onap.blueprintgenerator.models.componentspec.Artifacts; +import org.onap.blueprintgenerator.models.componentspec.Auxilary; +import org.onap.blueprintgenerator.models.componentspec.ComponentSpec; +import org.onap.blueprintgenerator.models.componentspec.Parameters; +import org.onap.blueprintgenerator.models.componentspec.Publishes; +import org.onap.blueprintgenerator.models.componentspec.Self; +import org.onap.blueprintgenerator.models.componentspec.Streams; +import org.onap.blueprintgenerator.models.componentspec.Subscribes; + +public class DmaapBlueprintTest { + + private static final String MOCKED_NAME = "sample.name"; + private static final String MESSAGE_ROUTER_TYPE_1 = "message_router"; + private static final String MESSAGE_ROUTER_TYPE_2 = "message router"; + private static final String DATA_ROUTER_TYPE_1 = "data_router"; + private static final String DATA_ROUTER_TYPE_2 = "data router"; + private static final String CONFIG_KEY_1 = "Configkey1"; + private static final String CONFIG_KEY_2 = "Configkey2"; + + private static final String TOPIC_NODE_1 = CONFIG_KEY_1 + "_topic"; + private static final String TOPIC_NODE_2 = CONFIG_KEY_2 + "_topic"; + private static final String FEED_NODE_1 = CONFIG_KEY_1 + "_feed"; + private static final String FEED_NODE_2 = CONFIG_KEY_2 + "_feed"; + + private static final String SAMPLE_FORMAT = "Format"; + private static final String SAMPLE_VERSION = "1.0.0"; + private static final String SAMPLE_ROUTE = "SampleRoute"; + private static final String SAMPLE_DESCRIPTION = "sample description"; + private static final String SAMPLE_PORTS = "8080:8080"; + private static final String SAMPLE_ARTIFACT_TYPE = "test"; + private static final String SAMPLE_ARTIFACT_URI = "test_uri"; + + @Test + public void dmaapBlueprintShouldHaveNodeTemplateWithDmaapNode() { + + //given + ComponentSpec componentSpec = getMockedComponentSpec(); + DmaapBlueprint dmaapBlueprint = new DmaapBlueprint(); + + //when + Blueprint resultBlueprint = dmaapBlueprint.createDmaapBlueprint(componentSpec, "", ""); + + //then + assertTrue(resultBlueprint.getNode_templates().get(MOCKED_NAME) instanceof DmaapNode); + } + + @Test + public void nodeTemplateHasTopicNodeWhenAddMessageRouterAsPublishes() { + //given + ComponentSpec componentSpec = getMockedComponentSpec(); + Streams streams = new Streams(); + streams.setPublishes(getMessageRouterPublishes()); + streams.setSubscribes(new Subscribes[0]); + + when(componentSpec.getStreams()).thenReturn(streams); + DmaapBlueprint dmaapBlueprint = new DmaapBlueprint(); + + //when + Blueprint resultBlueprint = dmaapBlueprint.createDmaapBlueprint(componentSpec, "", ""); + + //then + assertNotNull(resultBlueprint.getNode_templates().get(TOPIC_NODE_1)); + assertNotNull(resultBlueprint.getNode_templates().get(TOPIC_NODE_2)); + + } + + @Test + public void nodeTemplateHasTopicNodeWhenAddMessageRouterAsSubscribes() { + //given + ComponentSpec componentSpec = getMockedComponentSpec(); + Streams streams = new Streams(); + streams.setPublishes(new Publishes[0]); + streams.setSubscribes(getMessageRouterSubscribes()); + + when(componentSpec.getStreams()).thenReturn(streams); + DmaapBlueprint dmaapBlueprint = new DmaapBlueprint(); + + //when + Blueprint resultBlueprint = dmaapBlueprint.createDmaapBlueprint(componentSpec, "", ""); + + //then + assertNotNull(resultBlueprint.getNode_templates().get(TOPIC_NODE_1)); + assertNotNull(resultBlueprint.getNode_templates().get(TOPIC_NODE_2)); + + } + + @Test + public void nodeTemplateHasFeedNodeWhenAddDataRouterAsPublishes() { + //given + ComponentSpec componentSpec = getMockedComponentSpec(); + Streams streams = new Streams(); + streams.setPublishes(getDataRouterPublishes()); + streams.setSubscribes(new Subscribes[0]); + + when(componentSpec.getStreams()).thenReturn(streams); + DmaapBlueprint dmaapBlueprint = new DmaapBlueprint(); + + //when + Blueprint resultBlueprint = dmaapBlueprint.createDmaapBlueprint(componentSpec, "", ""); + + //then + assertNotNull(resultBlueprint.getNode_templates().get(FEED_NODE_1)); + assertNotNull(resultBlueprint.getNode_templates().get(FEED_NODE_2)); + + } + + @Test + public void nodeTemplateHasFeedNodeWhenAddDataRouterAsSubscribes() { + //given + ComponentSpec componentSpec = getMockedComponentSpec(); + Streams streams = new Streams(); + streams.setPublishes(new Publishes[0]); + streams.setSubscribes(getDataRouterSubscribes()); + + when(componentSpec.getStreams()).thenReturn(streams); + DmaapBlueprint dmaapBlueprint = new DmaapBlueprint(); + + //when + Blueprint resultBlueprint = dmaapBlueprint.createDmaapBlueprint(componentSpec, "", ""); + + //then + assertNotNull(resultBlueprint.getNode_templates().get(FEED_NODE_1)); + assertNotNull(resultBlueprint.getNode_templates().get(FEED_NODE_2)); + + } + + private Publishes[] getMessageRouterPublishes() { + List<Publishes> publishesList = new ArrayList<>(); + + publishesList.add(createSamplePublishes(MESSAGE_ROUTER_TYPE_1, CONFIG_KEY_1)); + publishesList.add(createSamplePublishes(MESSAGE_ROUTER_TYPE_2, CONFIG_KEY_2)); + return publishesList.toArray(new Publishes[0]); + } + + private Subscribes[] getMessageRouterSubscribes() { + List<Subscribes> subscribesList = new ArrayList<>(); + + subscribesList.add(createSampleSubscribes(MESSAGE_ROUTER_TYPE_1, CONFIG_KEY_1)); + subscribesList.add(createSampleSubscribes(MESSAGE_ROUTER_TYPE_2, CONFIG_KEY_2)); + return subscribesList.toArray(new Subscribes[0]); + } + + private Publishes[] getDataRouterPublishes() { + List<Publishes> publishesList = new ArrayList<>(); + + publishesList.add(createSamplePublishes(DATA_ROUTER_TYPE_1, CONFIG_KEY_1)); + publishesList.add(createSamplePublishes(DATA_ROUTER_TYPE_2, CONFIG_KEY_2)); + return publishesList.toArray(new Publishes[0]); + } + + private Subscribes[] getDataRouterSubscribes() { + List<Subscribes> subscribesList = new ArrayList<>(); + + subscribesList.add(createSampleSubscribes(DATA_ROUTER_TYPE_1, CONFIG_KEY_1)); + subscribesList.add(createSampleSubscribes(DATA_ROUTER_TYPE_2, CONFIG_KEY_2)); + return subscribesList.toArray(new Subscribes[0]); + } + + private Publishes createSamplePublishes(String type, String key) { + Publishes publishes = new Publishes(); + + publishes.setType(type); + publishes.setConfig_key(key); + publishes.setFormat(SAMPLE_FORMAT); + publishes.setVersion(SAMPLE_VERSION); + publishes.setRoute(SAMPLE_ROUTE); + + return publishes; + } + + private Subscribes createSampleSubscribes(String type, String key) { + Subscribes subscribes = new Subscribes(); + + subscribes.setType(type); + subscribes.setConfig_key(key); + subscribes.setFormat(SAMPLE_FORMAT); + subscribes.setVersion(SAMPLE_FORMAT); + subscribes.setRoute(SAMPLE_ROUTE); + + return subscribes; + } + + private ComponentSpec getMockedComponentSpec() { + Self self = mock(Self.class); + when(self.getDescription()).thenReturn(SAMPLE_DESCRIPTION); + when(self.getName()).thenReturn(MOCKED_NAME); + + Auxilary auxilary = mock(Auxilary.class); + ArrayList<Object> ports = new ArrayList<>(); + ports.add(SAMPLE_PORTS); + when(auxilary.getPorts()).thenReturn(ports); + + Streams streams = mock(Streams.class); + when(streams.getPublishes()).thenReturn(new Publishes[0]); + when(streams.getSubscribes()).thenReturn(new Subscribes[0]); + + Artifacts artifact = new Artifacts(); + artifact.setType(SAMPLE_ARTIFACT_TYPE); + artifact.setUri(SAMPLE_ARTIFACT_URI); + + Artifacts[] arrayArtifacts = new Artifacts[10]; + arrayArtifacts[0] = artifact; + + ComponentSpec componentSpec = mock(ComponentSpec.class); + when(componentSpec.getSelf()).thenReturn(self); + when(componentSpec.getAuxilary()).thenReturn(auxilary); + when(componentSpec.getStreams()).thenReturn(streams); + when(componentSpec.getArtifacts()).thenReturn(arrayArtifacts); + when(componentSpec.getParameters()).thenReturn(new Parameters[0]); + return componentSpec; + } +} diff --git a/mod/bpgenerator/version.properties b/mod/bpgenerator/version.properties index 9e0d73d..303a703 100644 --- a/mod/bpgenerator/version.properties +++ b/mod/bpgenerator/version.properties @@ -1,6 +1,6 @@ major=1 -minor=4 -patch=0 +minor=5 +patch=1 base_version=${major}.${minor}.${patch} release_version=${base_version} snapshot_version=${base_version}-SNAPSHOT diff --git a/mod2/auth-service/Dockerfile b/mod2/auth-service/Dockerfile new file mode 100644 index 0000000..c427bda --- /dev/null +++ b/mod2/auth-service/Dockerfile @@ -0,0 +1,11 @@ +FROM onap/integration-java11:7.1.0 +WORKDIR /usr/app +VOLUME /tmp + +ADD target/auth-service-1.0.0-SNAPSHOT.jar auth-service-1.0.0-SNAPSHOT.jar + +EXPOSE 8082 + +ENTRYPOINT ["java", \ + "-Djava.security.egd=file:/dev/./urandom", \ + "-jar", "auth-service-1.0.0-SNAPSHOT.jar"]
\ No newline at end of file diff --git a/mod2/auth-service/pom.xml b/mod2/auth-service/pom.xml new file mode 100644 index 0000000..1fd4f02 --- /dev/null +++ b/mod2/auth-service/pom.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ /* + ~ * ============LICENSE_START======================================================= + ~ * org.onap.dcae + ~ * ================================================================================ + ~ * Copyright (c) 2020 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========================================================= + ~ */ + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.onap.oparent</groupId> + <artifactId>oparent</artifactId> + <version>2.0.0</version> + </parent> + <groupId>org.onap.dcaegen2.platform.mod</groupId> + <artifactId>auth-service</artifactId> + <version>1.0.0-SNAPSHOT</version> + <name>auth-service</name> + <description>REST APIs to serve Auth Service</description> + + <properties> + <java.version>11</java.version> + <maven.compiler.source>${java.version}</maven.compiler.source> + <maven.compiler.target>${java.version}</maven.compiler.target> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-mongodb</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> + </dependency> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + <version>2.8.6</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>0.9.1</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-webflux</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> + <!-- CODE GENERATION --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + <dependency> + <groupId>com.squareup.okhttp3</groupId> + <artifactId>okhttp</artifactId> + <version>4.0.1</version> + </dependency> + + <!--TEST DEPENDENCIES--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.squareup.okhttp3</groupId> + <artifactId>mockwebserver</artifactId> + <version>4.0.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.projectreactor</groupId> + <artifactId>reactor-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>javax.xml.bind</groupId> + <artifactId>jaxb-api</artifactId> + <version>2.3.1</version> + </dependency> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <version>RELEASE</version> + <scope>test</scope> + </dependency> + </dependencies> + + <dependencyManagement> + <dependencies> + <dependency> + <!-- Import dependency management from Spring Boot --> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>2.2.5.RELEASE</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>2.2.5.RELEASE</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.22.2</version> + </plugin> + </plugins> + </build> +</project> diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/AuthServiceApplication.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/AuthServiceApplication.java new file mode 100644 index 0000000..5b147bf --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/AuthServiceApplication.java @@ -0,0 +1,40 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author + * @date 09/08/2020 + * Auth Service Application + */ +@SpringBootApplication +public class AuthServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(AuthServiceApplication.class, args); + } + +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/DataLoader.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/DataLoader.java new file mode 100644 index 0000000..959b450 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/DataLoader.java @@ -0,0 +1,97 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod; + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +/** + * @author + * @date 09/08/2020 + * To Initialize Roles and create Default Admin User + */ +@Component +public class DataLoader implements ApplicationRunner { + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + PasswordEncoder passwordEncoder; + + @Override + public void run(ApplicationArguments args) throws Exception { + populateRoles(); + populateAdminUser(); + } + + private void populateRoles() { + List<Role> roles = createRoles(); + roles.forEach((role) -> { + boolean roleNotPresent = !roleRepository.findByName(role.getName()).isPresent(); + if(roleNotPresent) + roleRepository.save(role); + }); + + } + + private List<Role> createRoles() { + Role admin = new Role("ROLE_ADMIN"); + Role user = new Role("ROLE_USER"); + Role developer = new Role("ROLE_DEVELOPER"); + return Arrays.asList(admin, user, developer); + } + + private void populateAdminUser() { + boolean adminNotPresent = !userRepository.findByUsername("admin").isPresent(); + if(adminNotPresent) { + ModUser admin = createAdmin(); + userRepository.save(admin); + } + } + + private ModUser createAdmin() { + ModUser admin = new ModUser(); + admin.setUsername("admin"); + admin.setFullName("Admin"); + admin.setPassword(passwordEncoder.encode("admin@mod")); + HashSet<Role> roleAdmin = new HashSet<>(); + roleAdmin.add(roleRepository.findByName("ROLE_ADMIN").get()); + admin.setRoles(roleAdmin); + return admin; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/AuthController.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/AuthController.java new file mode 100644 index 0000000..6612138 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/AuthController.java @@ -0,0 +1,171 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.controllers; + +import org.onap.dcaegen2.platform.mod.exceptions.RoleNotExistsException; +import org.onap.dcaegen2.platform.mod.exceptions.UserAlreadyExistsException; +import org.onap.dcaegen2.platform.mod.models.LoginRequest; +import org.onap.dcaegen2.platform.mod.models.JwtResponse; +import org.onap.dcaegen2.platform.mod.models.SignupRequest; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.GenericResponse; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.onap.dcaegen2.platform.mod.security.jwt.JwtUtils; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + + +import javax.validation.Valid; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + + +/** + * @author + * @date 09/08/2020 + * Authentication Operations + */ +@RestController +@RequestMapping("/api/auth") +@CrossOrigin(origins = "*") +public class AuthController { + + @Autowired + AuthenticationManager authenticationManager; + + @Autowired + UserRepository userRepository; + + @Autowired + RoleRepository roleRepository; + + @Autowired + PasswordEncoder passwordEncoder; + + @Autowired + JwtUtils jwtUtils; + + @PreAuthorize("isAuthenticated()") + @PostMapping("/validate-token") + public ResponseEntity<?> validateToken() { + return new ResponseEntity("true", HttpStatus.OK); + } + + @PostMapping("/signin") + public ResponseEntity<?> authenticateUser(@RequestBody @Valid LoginRequest loginRequest) { + Authentication authentication = authenticateLoginRequest(loginRequest); + SecurityContextHolder.getContext().setAuthentication(authentication); + String jwt = jwtUtils.generateJwtToken(authentication); + return setUserContext(authentication, jwt); + } + + private Authentication authenticateLoginRequest(@RequestBody @Valid LoginRequest loginRequest) { + return authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()) + ); + } + + private ResponseEntity<?> setUserContext(Authentication authentication, String jwt) { + UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal(); + List<String> roles = setRolesFromUserDetails(userDetails); + return buildUserContext(jwt, userDetails, roles); + } + + private List<String> setRolesFromUserDetails(UserDetailsImpl userDetails) { + return userDetails.getAuthorities().stream() + .map(item -> ((GrantedAuthority) item).getAuthority()) + .collect(Collectors.toList()); + } + + private ResponseEntity<JwtResponse> buildUserContext(String jwt, UserDetailsImpl userDetails, List<String> roles) { + return ResponseEntity.ok(JwtResponse.builder() + .id(userDetails.getId()) + .roles(roles) + .username(userDetails.getUsername()) + .token(jwt) + .fullName(userDetails.getFullName()) + .build() + ); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping("/signup") + public ResponseEntity<?> registerUser(@RequestBody @Valid SignupRequest request) { + checkIfUserExists(request); + ModUser user = createNewUser(request); + userRepository.save(user); + return ResponseEntity.ok(new GenericResponse("User registered successfully!")); + } + + private void checkIfUserExists(@RequestBody @Valid SignupRequest signUpRequest) { + if (userRepository.existsByUsername(signUpRequest.getUsername())) + throw new UserAlreadyExistsException("Username already exists!"); + } + + private ModUser createNewUser(@RequestBody @Valid SignupRequest request) { + ModUser user = new ModUser(); + user.setUsername(request.getUsername()); + user.setFullName(request.getFullName()); + user.setPassword(getEncodedPassword(request)); + Set<Role> roles = createRoles(request.getRoles()); + user.setRoles(roles); + return user; + } + + private String getEncodedPassword(@RequestBody @Valid SignupRequest request) { + return passwordEncoder.encode(request.getPassword()); + } + + public Set<Role> createRoles(Set<String> roleStrings) { + Set<Role> roles = new HashSet<>(); + for (String roleStr : roleStrings) { + roles.add(getRole(roleStr)); + } + return roles; + } + + private Role getRole(String roleStr) { + return roleRepository.findByName(roleStr).orElseThrow( + () -> new RoleNotExistsException(String.format("Role %s does not exist", roleStr))); + } +} + + diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/RoleController.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/RoleController.java new file mode 100644 index 0000000..e129cda --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/RoleController.java @@ -0,0 +1,58 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.controllers; + +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author + * @date 09/08/2020 + * Role Operations + */ +@RestController +@RequestMapping("/api/roles") +@CrossOrigin(origins = "*") +public class RoleController { + + @Autowired + RoleRepository roleRepository; + + @GetMapping + @ResponseStatus(HttpStatus.OK) + public List<String> getRoles(){ + return roleRepository.findAll() + .stream() + .map(role -> role.getName()) + .collect(Collectors.toList()); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/UserController.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/UserController.java new file mode 100644 index 0000000..90e7b62 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/controllers/UserController.java @@ -0,0 +1,96 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.controllers; + +import org.onap.dcaegen2.platform.mod.exceptions.UserNotFoundException; +import org.onap.dcaegen2.platform.mod.models.GenericResponse; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.UpdateUserRequest; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import org.onap.dcaegen2.platform.mod.services.MODUserDetailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + + +/** + * @author + * @date 09/08/2020 + * User Operations + */ +@RestController +@RequestMapping("/api/users") +@CrossOrigin(origins = "*") +public class UserController { + + @Autowired + private MODUserDetailService modUserDetailService; + + @Autowired + private UserDetailsServiceImpl userDetailsService; + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/getAll") + @ResponseStatus(HttpStatus.OK) + public List<ModUser> getAllUsers() { + return modUserDetailService.findAll(); + } + + @PreAuthorize("hasRole('ADMIN') or hasRole('USER')") + @GetMapping("/{username}") + public UserDetails getUser(@PathVariable String username) { + return userDetailsService.loadUserByUsername(username); + } + + @PreAuthorize("hasRole('ADMIN')") + @PatchMapping("/admin/{username}") + public ModUser adminUpdateUserProfile(@PathVariable String username, @RequestBody @Valid UpdateUserRequest + userRequest, @RequestHeader (name="Authorization") String token) { + return userDetailsService.adminUpdateUser(username, userRequest, token); + } + + @PreAuthorize("hasRole('USER') or hasRole('DEVELOPER')") + @PatchMapping("/user/{username}") + public ModUser userUpdateOwnProfile(@PathVariable String username, @RequestBody @Valid UpdateUserRequest + userRequest, @RequestHeader (name="Authorization") String token) { + return userDetailsService.userUpdateOwnProfile(username, userRequest, token); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/{username}") + public ResponseEntity<?> deleteUser(@PathVariable String username) { + modUserDetailService.deleteUserByUsername(username); + return ResponseEntity.ok(new GenericResponse("User " + username + " was removed")); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public void userNotFoundHandler(UserNotFoundException ex) { + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/AppExceptionHandler.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/AppExceptionHandler.java new file mode 100644 index 0000000..e029e69 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/AppExceptionHandler.java @@ -0,0 +1,52 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.exceptions; + +import org.onap.dcaegen2.platform.mod.models.GenericResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * @author + * @date 09/08/2020 + * Exception handler for the Auth Service Application + */ +@ControllerAdvice +@Slf4j +public class AppExceptionHandler { + + @ExceptionHandler + public ResponseEntity<GenericResponse> resolveRuntimeException(UserAlreadyExistsException ex){ + log.error(ex.getMessage()); + return new ResponseEntity<>(new GenericResponse(ex.getMessage()), HttpStatus.CONFLICT); + } + + @ExceptionHandler + public ResponseEntity<GenericResponse> resolveRoleNotFoundException(RoleNotExistsException ex){ + log.error(ex.getMessage()); + return new ResponseEntity<>(new GenericResponse(ex.getMessage()), HttpStatus.BAD_REQUEST); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/IllegalUserOperationException.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/IllegalUserOperationException.java new file mode 100644 index 0000000..4a5837a --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/IllegalUserOperationException.java @@ -0,0 +1,34 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.exceptions; + +/** + * @author + * @date 09/08/2020 + * Exception for Illegal Operation + */ +public class IllegalUserOperationException extends RuntimeException { + public IllegalUserOperationException(String s) { + super(s); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/RoleNotExistsException.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/RoleNotExistsException.java new file mode 100644 index 0000000..dfa6efb --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/RoleNotExistsException.java @@ -0,0 +1,34 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.exceptions; + +/** + * @author + * @date 09/08/2020 + * Exception for Role not exist + */ +public class RoleNotExistsException extends RuntimeException { + public RoleNotExistsException(String message) { + super(message); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserAlreadyExistsException.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserAlreadyExistsException.java new file mode 100644 index 0000000..475dc44 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserAlreadyExistsException.java @@ -0,0 +1,34 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.exceptions; + +/** + * @author + * @date 09/08/2020 + * Exception for User already exists + */ +public class UserAlreadyExistsException extends RuntimeException { + public UserAlreadyExistsException(String message) { + super(message); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserNotFoundException.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserNotFoundException.java new file mode 100644 index 0000000..95c6a70 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/exceptions/UserNotFoundException.java @@ -0,0 +1,34 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.exceptions; + +/** + * @author + * @date 09/08/2020 + * Exception for User Not Found + */ +public class UserNotFoundException extends RuntimeException { + public UserNotFoundException(String s) { + super(s); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/GenericResponse.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/GenericResponse.java new file mode 100644 index 0000000..c4625a4 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/GenericResponse.java @@ -0,0 +1,40 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +/** + * @author + * @date 09/08/2020 + * Generic Response for the Auth Service Request + */ +@Getter +@Setter +@AllArgsConstructor +public class GenericResponse { + + private String message; +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/JwtResponse.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/JwtResponse.java new file mode 100644 index 0000000..8855245 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/JwtResponse.java @@ -0,0 +1,50 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author + * @date 09/08/2020 + * JWT Response for the Auth Service Request + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class JwtResponse { + + private String token; + private String type = "Bearer"; + private String id; + private String username; + private String fullName; + private List<String> roles; + +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/LoginRequest.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/LoginRequest.java new file mode 100644 index 0000000..af0f710 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/LoginRequest.java @@ -0,0 +1,43 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @author + * @date 09/08/2020 + * Login request + */ +@Data +public class LoginRequest { + + @NotBlank + private String username; + + @NotBlank + private String password; + +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/ModUser.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/ModUser.java new file mode 100644 index 0000000..4da5c98 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/ModUser.java @@ -0,0 +1,75 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +/** + * @author + * @date 09/08/2020 + * Assigning Roles to User + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@Document(collection = "users") +public class ModUser implements Serializable { + + @Id + public String _id; + + @NotBlank + @Size(max = 10) + private String username; + + @NotBlank + private String password; + + @NotBlank + private String fullName; + + @DBRef + private Set<Role> roles = new HashSet<>(); + + public ModUser(@NotBlank @Size(max = 10) String username, @NotBlank String password, @NotBlank String fullName) { + this.username = username; + this.password = password; + this.fullName=fullName; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/Role.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/Role.java new file mode 100644 index 0000000..8cce344 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/Role.java @@ -0,0 +1,50 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * @author + * @date 09/08/2020 + * Roles + */ +@Document(collection = "roles") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Role { + + @Id + private String id; + + private String name; + + public Role(String name) { + this.name = name; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/SignupRequest.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/SignupRequest.java new file mode 100644 index 0000000..f705d76 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/SignupRequest.java @@ -0,0 +1,53 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * @author + * @date 09/08/2020 + * To validate User enter Details + */ +@Data +public class SignupRequest { + + @NotBlank(message = "username must not be blank") + @Size(min = 5, max = 10, message = "username must be between 5 and 10 characters.") + private String username; + + @NotNull(message = "username must not be null") + @Size(min = 1, message = "At least 1 role must be passed") + private Set<String> roles; + + @NotBlank(message = "password must not be blank") + private String password; + + @NotBlank(message = "Full name must not be blank") + private String fullName; +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/UpdateUserRequest.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/UpdateUserRequest.java new file mode 100644 index 0000000..6e3abf6 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/models/UpdateUserRequest.java @@ -0,0 +1,47 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.models; + +import lombok.Data; + +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * @author + * @date 09/08/2020 + * To update User Details of Name and Password + */ +@Data +public class UpdateUserRequest { + + @Size(min = 1, message = "At least 1 role must be passed") + private Set<String> roles; + + @Pattern(regexp = "^(?!\\s*$).+", message = "password must not be blank") + private String password; + + @Pattern(regexp = "^(?!\\s*$).+", message = "fullName must not be blank") + private String fullName; +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/RoleRepository.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/RoleRepository.java new file mode 100644 index 0000000..6efad17 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/RoleRepository.java @@ -0,0 +1,37 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.repositories; + +import org.onap.dcaegen2.platform.mod.models.Role; +import org.springframework.data.mongodb.repository.MongoRepository; + +import java.util.Optional; + +/** + * @author + * @date 09/08/2020 + * Interface to find user exists or not + */ +public interface RoleRepository extends MongoRepository<Role, String> { + Optional<Role> findByName(String name); +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/UserRepository.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/UserRepository.java new file mode 100644 index 0000000..442ebf1 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/repositories/UserRepository.java @@ -0,0 +1,40 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.repositories; + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.springframework.data.mongodb.repository.MongoRepository; + +import java.util.Optional; + +/** + * @author + * @date 09/08/2020 + * Interface to Find/Valid/Delete user + */ +public interface UserRepository extends MongoRepository<ModUser, String>{ + Optional<ModUser> findByUsername(String username); + Boolean existsByUsername(String username); + void deleteByUsername(String username); +} + diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/WebSecurityConfigurer.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/WebSecurityConfigurer.java new file mode 100644 index 0000000..cfccce4 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/WebSecurityConfigurer.java @@ -0,0 +1,92 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security; + +import org.onap.dcaegen2.platform.mod.security.jwt.AuthEntryPointJwt; +import org.onap.dcaegen2.platform.mod.security.jwt.AuthTokenFilter; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + + +/** + * @author + * @date 09/08/2020 + * Allows customization to the Spring WebSecurity + */ + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { + + @Autowired + UserDetailsServiceImpl userDetailsService; + + @Autowired + private AuthEntryPointJwt unauthorizedHandler; + + @Bean + public AuthTokenFilter authenticationJwtTokenFilter(){ + return new AuthTokenFilter(); + } + + @Override + protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { + authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception{ + return super.authenticationManagerBean(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.cors().and().csrf().disable() + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + .authorizeRequests().antMatchers("/api/auth/**").permitAll() + .antMatchers("/api/users/**").permitAll() + .anyRequest().authenticated(); + + http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthEntryPointJwt.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthEntryPointJwt.java new file mode 100644 index 0000000..310d487 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthEntryPointJwt.java @@ -0,0 +1,51 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security.jwt; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author + * @date 09/08/2020 + * JWT Authentication Entry Point + */ + +@Slf4j +@Component +public class AuthEntryPointJwt implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws IOException, ServletException { + log.error("Unauthorized error: {}", authException.getMessage()); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Error: Unauthorized"); + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthTokenFilter.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthTokenFilter.java new file mode 100644 index 0000000..012c333 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/AuthTokenFilter.java @@ -0,0 +1,81 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security.jwt; + +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author + * @date 09/08/2020 + * Authentication Token Filter + */ +@Slf4j +public class AuthTokenFilter extends OncePerRequestFilter { + + @Autowired + private JwtUtils jwtUtils; + + @Autowired + private UserDetailsServiceImpl userDetailsService; + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + try{ + String jwt = parseJwt(httpServletRequest); + if (jwt != null && jwtUtils.validateJwtToken(jwt)){ + String username = jwtUtils.getUserNameFromJwtToken(jwt); + UserDetails userDetails = userDetailsService.loadUserByUsername(username); + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + }catch (Exception e){ + logger.error("Cannot set user authentication: {}", e); + } + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + + private String parseJwt(HttpServletRequest httpServletRequest) { + String headerAuth = httpServletRequest.getHeader("Authorization"); + + if(StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")){ + return headerAuth.substring(7, headerAuth.length()); + } + return null; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/JwtUtils.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/JwtUtils.java new file mode 100644 index 0000000..3b6d311 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/jwt/JwtUtils.java @@ -0,0 +1,90 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security.jwt; + +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsImpl; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.SignatureException; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.UnsupportedJwtException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @author + * @date 09/08/2020 + * JWT Utils + */ +@Slf4j +@Component +public class JwtUtils { + + @Value("${mod-portal.jwt.secret}") + private String jwtSecret; + + @Value("${mod-portal.jwt.jwtExpirationMs}") + private int jwtExpirationMs; + + public String generateJwtToken(Authentication authentication) { + + UserDetailsImpl userPrincipal = (UserDetailsImpl) authentication.getPrincipal(); + + return Jwts.builder() + .setSubject((userPrincipal.getUsername())) + .claim("roles", userPrincipal.getAuthoritiesAsList()) + .claim("fullName", userPrincipal.getFullName()) + .setIssuedAt(new Date()) + .setExpiration(new Date((new Date()).getTime() + jwtExpirationMs)) + .signWith(SignatureAlgorithm.HS512, jwtSecret) + .compact(); + } + + public String getUserNameFromJwtToken(String token) { + return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody().getSubject(); + } + + public boolean validateJwtToken(String authToken) { + try { + Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); + return true; + } catch (SignatureException e) { + log.error("Invalid JWT signature: {}", e.getMessage()); + } catch (MalformedJwtException e) { + log.error("Invalid JWT token: {}", e.getMessage()); + } catch (ExpiredJwtException e) { + log.error("JWT token is expired: {}", e.getMessage()); + } catch (UnsupportedJwtException e) { + log.error("JWT token is unsupported: {}", e.getMessage()); + } catch (IllegalArgumentException e) { + log.error("JWT claims string is empty: {}", e.getMessage()); + } + + return false; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsImpl.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsImpl.java new file mode 100644 index 0000000..82cb577 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsImpl.java @@ -0,0 +1,127 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security.services; + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.EqualsAndHashCode; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author + * @date 09/08/2020 + * User Details Implementation + */ +@EqualsAndHashCode +public class UserDetailsImpl implements UserDetails{ + + private static final long serialVersionUID = 1L; + + private String id; + + private String username; + + private String fullName; + + @JsonIgnore + private String password; + + private Collection<? extends GrantedAuthority> authorities; + + public UserDetailsImpl(String id, String username, String fullName, String password, Collection<? + extends GrantedAuthority> authorities) { + this.id = id; + this.username = username; + this.fullName = fullName; + this.password = password; + this.authorities = authorities; + } + + public static UserDetails build(ModUser user) { + List<GrantedAuthority> authorities = user.getRoles().stream() + .map(role -> new SimpleGrantedAuthority(role.getName())) + .collect(Collectors.toList()); + + return new UserDetailsImpl( + user.get_id(), + user.getUsername(), + user.getFullName(), + user.getPassword(), + authorities + ); + } + + public String getId() { + return id; + } + + @Override + public Collection<? extends GrantedAuthority> getAuthorities() { + return authorities; + } + + public List<String> getAuthoritiesAsList(){ + return authorities.stream().map(GrantedAuthority::getAuthority) + .collect(Collectors.toList()); + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getUsername() { + return username; + } + + public String getFullName() { + return fullName; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsServiceImpl.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsServiceImpl.java new file mode 100644 index 0000000..5c13e11 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/security/services/UserDetailsServiceImpl.java @@ -0,0 +1,100 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.security.services; + +import org.onap.dcaegen2.platform.mod.controllers.AuthController; +import org.onap.dcaegen2.platform.mod.exceptions.UserNotFoundException; +import org.onap.dcaegen2.platform.mod.exceptions.IllegalUserOperationException; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.models.UpdateUserRequest; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.onap.dcaegen2.platform.mod.security.jwt.JwtUtils; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.Set; + +/** + * @author + * @date 09/08/2020 + * User Details Service + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Autowired + @Setter + UserRepository userRepository; + + @Autowired + PasswordEncoder passwordEncoder; + + @Autowired + AuthController authController; + + @Autowired + private JwtUtils jwtUtils; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + ModUser user = userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username)); + + return UserDetailsImpl.build(user); + } + + public ModUser adminUpdateUser(String username, UpdateUserRequest userRequest, String token) { + return updateUserProfile(username, userRequest); + } + + public ModUser userUpdateOwnProfile(String username, UpdateUserRequest userRequest, String token) { + String usernameFromToken = jwtUtils.getUserNameFromJwtToken(token.substring(7)); + if (usernameFromToken.equals(username)) { + return updateUserProfile(username, userRequest); + } else { + throw new IllegalUserOperationException("Permission denied to update user profile of " + username); + } + } + + private ModUser updateUserProfile(String username, UpdateUserRequest userRequest) { + ModUser modUser = userRepository.findByUsername(username).orElseThrow(() -> new UserNotFoundException(String.format("User %s not found", username))); + modUser = updateUserFields(modUser, userRequest); + return userRepository.save(modUser); + } + + private ModUser updateUserFields(ModUser modUser, UpdateUserRequest userRequest) { + if (userRequest.getFullName() != null) modUser.setFullName(userRequest.getFullName()); + if (userRequest.getPassword() != null) modUser.setPassword(passwordEncoder.encode(userRequest.getPassword())); + if (userRequest.getRoles() != null) { + Set<Role> roles = authController.createRoles(userRequest.getRoles()); + modUser.setRoles(roles); + } + return modUser; + } +} diff --git a/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/services/MODUserDetailService.java b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/services/MODUserDetailService.java new file mode 100644 index 0000000..a6a6de5 --- /dev/null +++ b/mod2/auth-service/src/main/java/org/onap/dcaegen2/platform/mod/services/MODUserDetailService.java @@ -0,0 +1,56 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.services; + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author + * @date 09/08/2020 + * This Service provides APIs to manage User Entity + */ + +@Service +public class MODUserDetailService { + + @Autowired + private UserRepository userRepository; + + public MODUserDetailService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + public List<ModUser> findAll() { + return userRepository.findAll(); + } + + public void deleteUserByUsername(String username) { + userRepository.deleteByUsername(username); + } + +} diff --git a/mod2/auth-service/src/main/resources/application.properties b/mod2/auth-service/src/main/resources/application.properties new file mode 100644 index 0000000..f3f5d37 --- /dev/null +++ b/mod2/auth-service/src/main/resources/application.properties @@ -0,0 +1,32 @@ +# +# /* +# * ============LICENSE_START======================================================= +# * org.onap.dcae +# * ================================================================================ +# * Copyright (c) 2020 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========================================================= +# */ +# + +server.port=8082 + +#spring.data.mongodb.host=mongo_db +spring.data.mongodb.host=localhost +#spring.data.mongodb.host=zlecdyh2bdcc1s2dokr05.ec53e7.dyh2b.tci.att.com +spring.data.mongodb.port=27017 +spring.data.mongodb.database=dcae_mod + +mod-portal.jwt.secret=mod2020! +mod-portal.jwt.jwtExpirationMs=43200000
\ No newline at end of file diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/AuthObjectMother.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/AuthObjectMother.java new file mode 100644 index 0000000..3a22af3 --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/AuthObjectMother.java @@ -0,0 +1,85 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.objectmothers; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.onap.dcaegen2.platform.mod.models.LoginRequest; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.models.SignupRequest; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsImpl; +import org.onap.dcaegen2.platform.mod.util.TestUtil; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author + * @date 09/22/2020 + * Mock for AuthenticationController Test Case + */ + +public class AuthObjectMother { + public static final String LOGIN_REQUEST = "src/test/resources/http/requests/AuthLoginRequest.json"; + public static final String SIGNUP_REQUEST = "src/test/resources/http/requests/AuthSignupRequest.json"; + + public static String asJsonString(final Object object) { + try { + return new ObjectMapper().writeValueAsString(object); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static LoginRequest getLoginRequest() { + return TestUtil.deserializeJsonFileToModel(LOGIN_REQUEST, LoginRequest.class); + } + + public static SignupRequest getSignupRequest() { + return TestUtil.deserializeJsonFileToModel(SIGNUP_REQUEST, SignupRequest.class); + } + + public static UserDetailsImpl getUserDetailsImpl() { + SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority("ROLE_ADMIN"); + List authorities = new ArrayList(); + authorities.add(simpleGrantedAuthority); + return new UserDetailsImpl("admin123", "admin123", "admin123", "admin123", authorities); + } + + public static ModUser getModUser() { + ModUser user = new ModUser(); + user.setUsername("test"); + user.setFullName("test"); + user.setPassword("password"); + Set<Role> roles = new HashSet<>(); + Role role = new Role(); + role.setName("test"); + role.setId("123"); + roles.add(role); + user.setRoles(roles); + return user; + } +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/RoleObjectMother.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/RoleObjectMother.java new file mode 100644 index 0000000..68002ac --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/RoleObjectMother.java @@ -0,0 +1,56 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.objectmothers; + + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author + * @date 09/22/2020 + * Mock for RoleController Test Case + */ +public class RoleObjectMother { + + public static List<Role> getRoles() { + List<Role> roles = new ArrayList(); + Role role1 = new Role(); + role1.setId("123"); + role1.setName("Admin123"); + + Role role2 = new Role(); + role2.setId("1234"); + role2.setName("Admin1234"); + + roles.add(role1); + roles.add(role2); + + return roles; + } + +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/UserObjectMother.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/UserObjectMother.java new file mode 100644 index 0000000..301b81f --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/objectmothers/UserObjectMother.java @@ -0,0 +1,100 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.objectmothers; + + +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.models.UpdateUserRequest; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsImpl; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author + * @date 09/22/2020 + * Mock for UserController Test Case + */ +public class UserObjectMother { + + public static final String userId = "admin"; + + public static List<ModUser> getUsers() { + List<ModUser> users = new ArrayList(); + ModUser modUser1 = new ModUser(); + modUser1.set_id("123"); + modUser1.setFullName("Admin123"); + modUser1.setPassword("Admin123"); + Set<Role> roles = new HashSet<>(); + Role role = new Role(); + role.setName("test"); + role.setId("123"); + roles.add(role); + modUser1.setRoles(roles); + + ModUser modUser2 = new ModUser(); + modUser2.set_id("1234"); + modUser2.setFullName("Admin1234"); + modUser2.setPassword("Admin1234"); + Set<Role> roles1 = new HashSet<>(); + Role role1 = new Role(); + role.setName("test1"); + role.setId("1234"); + roles.add(role1); + modUser2.setRoles(roles1); + + users.add(modUser1); + users.add(modUser2); + + return users; + } + + public static ModUser getModUser() { + ModUser user = new ModUser(); + user.setUsername("test"); + user.setFullName("test"); + user.setPassword("password"); + Set<Role> roles = new HashSet<>(); + Role role = new Role(); + role.setName("test"); + role.setId("123"); + roles.add(role); + user.setRoles(roles); + return user; + } + + public static UpdateUserRequest getUpdateUserRequest(){ + UpdateUserRequest user = new UpdateUserRequest(); + user.setFullName("test"); + user.setPassword("password"); + Set<String> roles = new HashSet<>(); + roles.add("ROLE_PST"); + user.setRoles(roles); + return user; + } + +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/util/TestUtil.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/util/TestUtil.java new file mode 100644 index 0000000..111653f --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/util/TestUtil.java @@ -0,0 +1,60 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.util; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +/** + * @author + * @date 09/22/2020 + * TestUtils for test cases + */ +public class TestUtil { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + private TestUtil() {} + + public static Map<String, Object> readJsonFileAsObjectMap(String filePath) { + try { + return MAPPER.readValue(new File(filePath), new TypeReference<Map<String, Object>>() {}); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + public static <T> T deserializeJsonFileToModel(String filePath, Class<T> modelClass) { + try { + return MAPPER.readValue(new File(filePath), modelClass); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/AuthControllerTest.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/AuthControllerTest.java new file mode 100644 index 0000000..2aad289 --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/AuthControllerTest.java @@ -0,0 +1,149 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.onap.dcaegen2.platform.mod.controllers.AuthController; +import org.onap.dcaegen2.platform.mod.models.*; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.onap.dcaegen2.platform.mod.security.jwt.AuthEntryPointJwt; +import org.onap.dcaegen2.platform.mod.security.jwt.JwtUtils; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.*; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeTest; + +import java.io.IOException; +import java.util.Optional; + +import static org.hamcrest.core.IsNull.notNullValue; +import static org.mockito.Mockito.*; +import static org.onap.dcaegen2.platform.mod.objectmothers.AuthObjectMother.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * @author + * @date 09/22/2020 + * Mock Test cases for AuthenticationController + */ +@WebMvcTest(AuthController.class) +public class AuthControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + JwtUtils jwtUtils; + + @MockBean + AuthenticationManager authenticationManager; + + @MockBean + UserRepository userRepository; + + @MockBean + RoleRepository roleRepository; + + @MockBean + PasswordEncoder passwordEncoder; + + @MockBean + UserDetailsServiceImpl userDetailsService; + + @MockBean + AuthEntryPointJwt authEntryPointJwt; + + @Mock + Authentication authentication; + + @BeforeEach + void setUp() { + } + + + @Test + void test_signin_returnsSuccessResponse() throws Exception { + + LoginRequest loginRequest = getLoginRequest(); + + when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()))).thenReturn(authentication); + when(authentication.getPrincipal()).thenReturn(getUserDetailsImpl()); + when(jwtUtils.generateJwtToken(any())).thenReturn("Demo"); + + mockMvc.perform(post("/api/auth/signin") + .contentType(MediaType.APPLICATION_JSON) + .content(asJsonString(loginRequest)).accept(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.token", notNullValue())) + .andExpect(status().isOk()); + + verify(authenticationManager, times(1)).authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); + verify(jwtUtils, times(1)).generateJwtToken(any()); + } + + + @WithMockUser(roles="ADMIN") + @Test + void test_signup_returnsSuccessResponse() throws Exception { + + SignupRequest signUpRequest = getSignupRequest(); + + when(userRepository.existsByUsername(signUpRequest.getUsername())).thenReturn(false); + when(passwordEncoder.encode(signUpRequest.getPassword())).thenReturn("password"); + when(roleRepository.findByName(anyString())).thenReturn(Optional.of(new Role())); + when(userRepository.save(any())).thenReturn(getModUser()); + + mockMvc.perform(post("/api/auth/signup") + .contentType(MediaType.APPLICATION_JSON) + .content(asJsonString(signUpRequest)).accept(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.message", notNullValue())) + .andExpect(status().isOk()); + + verify(userRepository, times(1)).existsByUsername(signUpRequest.getUsername()); + verify(passwordEncoder, times(1)).encode(signUpRequest.getPassword()); + verify(roleRepository, times(1)).findByName(anyString()); + verify(userRepository, times(1)).save(any()); + } + + +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/RoleControllerTest.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/RoleControllerTest.java new file mode 100644 index 0000000..48b5d4b --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/RoleControllerTest.java @@ -0,0 +1,109 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.web; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.onap.dcaegen2.platform.mod.controllers.RoleController; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.Role; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.onap.dcaegen2.platform.mod.security.jwt.AuthEntryPointJwt; +import org.onap.dcaegen2.platform.mod.security.jwt.JwtUtils; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.hamcrest.core.IsNull.notNullValue; +import static org.onap.dcaegen2.platform.mod.objectmothers.AuthObjectMother.asJsonString; +import static org.onap.dcaegen2.platform.mod.objectmothers.RoleObjectMother.getRoles; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * @author + * @date 09/22/2020 + * Mock Test cases for RoleController + */ +@WebMvcTest(RoleController.class) +public class RoleControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + RoleRepository roleRepository; + + @MockBean + UserDetailsServiceImpl userDetailsService; + + @MockBean + AuthEntryPointJwt authEntryPointJwt; + + @MockBean + JwtUtils jwtUtils; + + @Mock + Authentication authentication; + + @BeforeEach + void setUp() { + } + + + @Test + void test_getRoles() throws Exception { + + Mockito.when(roleRepository.findAll()).thenReturn(getRoles()); + + MvcResult result = mockMvc.perform(get("/api/roles") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + Assert.assertNotNull(result.getResponse().getContentAsString()); + + } + +} diff --git a/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/UserControllerTest.java b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/UserControllerTest.java new file mode 100644 index 0000000..1374e0e --- /dev/null +++ b/mod2/auth-service/src/test/java/org/onap/dcaegen2/platform/mod/web/UserControllerTest.java @@ -0,0 +1,168 @@ +/* + * + * * ============LICENSE_START======================================================= + * * org.onap.dcae + * * ================================================================================ + * * Copyright (c) 2020 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.dcaegen2.platform.mod.web; + +import org.apache.tools.ant.taskdefs.optional.extension.Specification; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.Request; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.onap.dcaegen2.platform.mod.controllers.RoleController; +import org.onap.dcaegen2.platform.mod.controllers.UserController; +import org.onap.dcaegen2.platform.mod.models.LoginRequest; +import org.onap.dcaegen2.platform.mod.models.ModUser; +import org.onap.dcaegen2.platform.mod.models.UpdateUserRequest; +import org.onap.dcaegen2.platform.mod.repositories.RoleRepository; +import org.onap.dcaegen2.platform.mod.repositories.UserRepository; +import org.onap.dcaegen2.platform.mod.security.jwt.AuthEntryPointJwt; +import org.onap.dcaegen2.platform.mod.security.jwt.JwtUtils; +import org.onap.dcaegen2.platform.mod.security.services.UserDetailsServiceImpl; +import org.onap.dcaegen2.platform.mod.services.MODUserDetailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.client.RequestMatcher; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultMatcher; + +import java.util.Optional; + +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.onap.dcaegen2.platform.mod.objectmothers.AuthObjectMother.asJsonString; +import static org.onap.dcaegen2.platform.mod.objectmothers.AuthObjectMother.getModUser; +import static org.onap.dcaegen2.platform.mod.objectmothers.RoleObjectMother.getRoles; +import static org.onap.dcaegen2.platform.mod.objectmothers.UserObjectMother.*; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * @author + * @date 09/22/2020 + * Mock Test cases for UserController + */ +@WebMvcTest(UserController.class) +public class UserControllerTest { + + + @Autowired + private MockMvc mockMvc; + + @MockBean + UserDetailsServiceImpl userDetailsService; + + @MockBean + UserRepository userRepository; + + @MockBean + MODUserDetailService modUserDetailService; + + @MockBean + RoleRepository roleRepository; + + @MockBean + AuthEntryPointJwt authEntryPointJwt; + + @MockBean + JwtUtils jwtUtils; + + @Mock + Authentication authentication; + + + @BeforeEach + void setUp() { + } + + @WithMockUser(roles="ADMIN") + @Test + void test_getUsername() throws Exception { + + when(userRepository.findByUsername(any())).thenReturn(Optional.of(new ModUser())); + + MvcResult result = mockMvc.perform(get("/api/users/" + userId) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + Assert.assertNotNull(result.getResponse().getContentAsString()); + verify(userRepository, times(1)).findByUsername(any()); + } + + @Test + void test_getAllUsers() throws Exception { + + when(modUserDetailService.findAll()).thenReturn(getUsers()); + + MvcResult result = mockMvc.perform(get("/api/users/getAll") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + Assert.assertNotNull(result.getResponse().getContentAsString()); + verify(modUserDetailService, times(1)).findAll(); + } + + + @WithMockUser(roles="ADMIN") + @Test + void test_deleteUser() throws Exception { + + doNothing().when(modUserDetailService).deleteUserByUsername(any(String.class)); + + MvcResult result = mockMvc.perform(delete("/api/users/" + userId) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()).andReturn(); + + Assert.assertNotNull(result.getResponse().getContentAsString()); + verify(modUserDetailService, times(1)).deleteUserByUsername(any(String.class)); + } + + + @WithMockUser(username="ADMIN") + @Test + void test_userUpdateOwnProfile_returnsSuccessResponse() throws Exception { + //arrange + UpdateUserRequest updateUserRequest = getUpdateUserRequest(); + + when(userDetailsService.adminUpdateUser(userId,updateUserRequest,"token")).thenReturn(getModUser()); + + mockMvc.perform(patch("/api/users/admin/" + userId) + //.header("Authorization", "token") + .contentType(MediaType.APPLICATION_JSON) + .content(asJsonString(updateUserRequest)).accept(MediaType.APPLICATION_JSON)) + //.andExpect(jsonPath("$.message", notNullValue())) + .andExpect(status().isOk()).andReturn(); + + verify(userDetailsService, times(1)).adminUpdateUser(anyString(),updateUserRequest,anyString()); + } + + +}
\ No newline at end of file diff --git a/mod2/auth-service/src/test/resources/application.properties b/mod2/auth-service/src/test/resources/application.properties new file mode 100644 index 0000000..d6a913c --- /dev/null +++ b/mod2/auth-service/src/test/resources/application.properties @@ -0,0 +1 @@ +#spring.data.mongodb.port=0
\ No newline at end of file diff --git a/mod2/auth-service/src/test/resources/http/requests/AuthLoginRequest.json b/mod2/auth-service/src/test/resources/http/requests/AuthLoginRequest.json new file mode 100644 index 0000000..fbdc4a9 --- /dev/null +++ b/mod2/auth-service/src/test/resources/http/requests/AuthLoginRequest.json @@ -0,0 +1,4 @@ +{ + "username": "admin", + "password": "admin@mod" +} diff --git a/mod2/auth-service/src/test/resources/http/requests/AuthSignupRequest.json b/mod2/auth-service/src/test/resources/http/requests/AuthSignupRequest.json new file mode 100644 index 0000000..25be086 --- /dev/null +++ b/mod2/auth-service/src/test/resources/http/requests/AuthSignupRequest.json @@ -0,0 +1,6 @@ +{ + "username": "admin1", + "fullName": "Administrator", + "password": "admin@mod", + "roles": ["ROLE_PST"] +}
\ No newline at end of file diff --git a/mod2/auth-service/src/test/resources/specification/componentSpec_hello_world-with-dmaap.json b/mod2/auth-service/src/test/resources/specification/componentSpec_hello_world-with-dmaap.json new file mode 100644 index 0000000..0ad6b6e --- /dev/null +++ b/mod2/auth-service/src/test/resources/specification/componentSpec_hello_world-with-dmaap.json @@ -0,0 +1,149 @@ +{ + "self": { + "component_type": "docker", + "description": "Hello World mS for subscribing the data from local DMaaP, DR or MR, processing them and publishing them as PM files to local DMaaP DR", + "name": "dcae-collectors-vcc-helloworld-pm", + "version": "1.0.1" + }, + + "services": { + "calls": [], + "provides": [] + }, + + "streams": { + "publishes": [{ + "config_key": "DCAE-HELLO-WORLD-PUB-DR", + "format": "dataformat_Hello_World_PM", + "type": "data_router", + "version": "1.0.0" + }, + { + "config_key": "DCAE-HELLO-WORLD-PUB-MR", + "format": "dataformat_Hello_World_PM", + "type": "message_router", + "version": "1.0.0" + } + ], + + "subscribes": [{ + "config_key": "DCAE-HELLO-WORLD-SUB-MR", + "format": "dataformat_Hello_World_PM", + "route": "/DCAE_HELLO_WORLD_SUB_MR", + "type": "message_router", + "version": "1.0.0" + }, + { + "config_key": "DCAE-HELLO-WORLD-SUB-DR", + "format": "dataformat_Hello_World_PM", + "route": "/DCAE-HELLO-WORLD-SUB-DR", + "type": "data_router", + "version": "1.0.0" + } + ] + }, + + "parameters": + [ + { + "name": "vcc_hello_name", + "value": "120", + "type": "integer", + "description": "the name entered for specific person", + "sourced_at_deployment": false, + "designer_editable": false, + "policy_editable": false + }, + + { + "name": "useDtiConfig", + "value": false, + "type" : "boolean", + "description": "component depends on configuration from dti.", + "sourced_at_deployment": false, + "designer_editable": true, + "policy_editable": false, + "required" : true + }, + + { + "name": "isSelfServeComponent", + "value": false, + "type": "boolean", + "description": "Is this used as self serve component.", + "sourced_at_deployment": false, + "designer_editable": true, + "policy_editable": false, + "required" : true + } + ], + + "auxilary": { + "healthcheck": { + "interval": "60s", + "initialDelaySeconds": "120s", + "timeout": "20s", + "script": "/opt/app/vcc/bin/common/HealthCheck_HelloWorld.sh", + "type": "docker" + }, + "livehealthcheck": { + "interval": "60s", + "initialDelaySeconds": "120s", + "timeout": "20s", + "script": "/opt/app/vcc/bin/common/HealthCheck_HelloWorld.sh", + "type": "docker" + }, + "reconfigs":{ + "app_reconfig" : "abc" + }, + + "volumes": [ + { + "container": { + "bind": "/opt/app/dcae-certificate" + }, + "host": { + "path": "/opt/app/dcae-certificate" + } + }, + { + "container": { + "bind": "/opt/logs/DCAE/dmd/AGENT" + }, + "host": { + "path": "/opt/logs/DCAE/helloworldpm/dmd/AGENT" + } + }, + { + "container": { + "bind": "/opt/logs/DCAE/dmd/WATCHER" + }, + "host": { + "path": "/opt/logs/DCAE/helloworldpm/dmd/WATCHER" + } + }, + { + "container": { + "bind": "/opt/app/vcc/logs/DCAE" + }, + "host": { + "path": "/opt/logs/DCAE/helloworldpm/vcc-logs" + } + }, + { + "container": { + "bind": "/opt/app/vcc/archive/data" + }, + "host": { + "path": "/opt/data/DCAE/helloworldpm/vcc-archive" + } + } + + ] + + }, + "artifacts": [{ + "type": "docker image", + "uri": "dockercentral.it.att.com:5100/com.att.sample/dcae-controller-vcc-helloworld-pm:18.02-001" + }] +}
\ No newline at end of file diff --git a/mod2/auth-service/src/test/resources/specification/policy_json_sample_3.json b/mod2/auth-service/src/test/resources/specification/policy_json_sample_3.json new file mode 100644 index 0000000..4a8c76f --- /dev/null +++ b/mod2/auth-service/src/test/resources/specification/policy_json_sample_3.json @@ -0,0 +1,28 @@ +{ + "policies": [ + { + "configAttributes": "", + "configName": "", + "onapName": "DCAE", + "policyName": "DCAE.Config_", + "unique": false + }, + { + "onapName": "DCAE", + "policyName": "DCAE.Config_", + "unique": true + }, + { + "configAttributes": "", + "configName": "", + "onapName": "DCAE", + "policyName": "DCAE.Config_*", + "unique": false + } + ], + "policy": [ + { + "policy_id" : "id_0" + } + ] +}
\ No newline at end of file diff --git a/releases/1.1.0-distributorapi-container.yaml b/releases/1.1.0-distributorapi-container.yaml new file mode 100644 index 0000000..f80e5d1 --- /dev/null +++ b/releases/1.1.0-distributorapi-container.yaml @@ -0,0 +1,9 @@ +distribution_type: 'container' +container_release_tag: '1.1.0' +project: 'dcaegen2-platform' +log_dir: 'dcaegen2-platform-mod-distributorapi-docker-merge-master/30' +ref: 66ae1f86dd66a064c6095fce19bc7dd6dd072473 +containers: + - name: 'org.onap.dcaegen2.platform.mod.distributorapi' + version: '1.1.0-SNAPSHOT-20200908T140636Z' +git_tag: '1.1.0-mod-distributorapi' diff --git a/releases/1.5.0-blueprint-generator.yaml b/releases/1.5.0-blueprint-generator.yaml new file mode 100644 index 0000000..928096d --- /dev/null +++ b/releases/1.5.0-blueprint-generator.yaml @@ -0,0 +1,4 @@ +distribution_type: 'maven' +version: '1.5.0' +project: 'dcaegen2/platform' +log_dir: 'dcaegen2-platform-mod-bpgenerator-maven-stage-master/225' diff --git a/releases/2.12.3-onboardingapi-container.yaml b/releases/2.12.3-onboardingapi-container.yaml new file mode 100644 index 0000000..1b0dfb9 --- /dev/null +++ b/releases/2.12.3-onboardingapi-container.yaml @@ -0,0 +1,9 @@ +distribution_type: 'container' +container_release_tag: '2.12.3' +project: 'dcaegen2-platform' +log_dir: 'dcaegen2-platform-mod-onboardingapi-docker-merge-master/30' +ref: b4287ad1fab97142df4d5260ec94d41bb782992a +containers: + - name: 'org.onap.dcaegen2.platform.mod.onboardingapi' + version: '2.12.3-SNAPSHOT-20200908T020337Z' +git_tag: '2.12.3-mod-onboardingapi' |