Use data owner attribute instead of owning entity for OwnerCheck 84/116084/4
authorM.Hosnidokht <mohammad.hosnidokht@yoppworks.com>
Thu, 3 Dec 2020 16:11:16 +0000 (11:11 -0500)
committerM.Hosnidokht <mohammad.hosnidokht@yoppworks.com>
Wed, 6 Jan 2021 15:15:57 +0000 (10:15 -0500)
Issue-ID: AAI-3226
Signed-off-by: Mohammad Hosnidokht <mohammad.hosnidokht@yoppworks.com>
Change-Id: I8222546e7264e99ca3e53fe1212a45008c1064e6

20 files changed:
aai-aaf-auth/pom.xml
aai-annotations/pom.xml
aai-auth/pom.xml
aai-common-docker/aai-common-images/pom.xml
aai-common-docker/aai-haproxy-image/pom.xml
aai-common-docker/pom.xml
aai-core/pom.xml
aai-core/src/main/java/org/onap/aai/introspection/sideeffect/OwnerCheck.java
aai-core/src/main/java/org/onap/aai/serialization/db/DBSerializer.java
aai-core/src/test/java/org/onap/aai/introspection/sideeffect/OwnerCheckTest.java
aai-core/src/test/resources/onap/oxm/v14/aai_oxm_v14.xml
aai-els-onap-logging/pom.xml
aai-failover/pom.xml
aai-parent/pom.xml
aai-rest/pom.xml
aai-schema-abstraction/pom.xml
aai-schema-ingest/pom.xml
aai-utils/pom.xml
pom.xml
version.properties

index b49dc05..2a36f28 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-aaf-auth</artifactId>
index 0dce6eb..0f2d076 100644 (file)
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-annotations</artifactId>
index a6dc107..8b039ca 100644 (file)
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-auth</artifactId>
index 93af8df..e4fd46d 100644 (file)
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-common-docker</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>aai-common-images</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.1-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>aai-aai-common-images</name>
     <description>Contains dockerfiles for aai-common images (alpine and ubuntu based).</description>
index 518fe7c..cf57e6e 100644 (file)
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-common-docker</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>aai-haproxy-image</artifactId>
index 53313cf..01175e3 100644 (file)
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
 
index 8f03d5d..56183fe 100644 (file)
@@ -8,9 +8,9 @@ Copyright © 2019 AT&T Intellectual Property. All rights reserved.
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
-               
+
 http://www.apache.org/licenses/LICENSE-2.0
-               
+
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,7 +26,7 @@ limitations under the License.
        <parent>
                <groupId>org.onap.aai.aai-common</groupId>
                <artifactId>aai-parent</artifactId>
-               <version>1.8.0-SNAPSHOT</version>
+               <version>1.8.1-SNAPSHOT</version>
                <relativePath>../aai-parent/pom.xml</relativePath>
        </parent>
        <artifactId>aai-core</artifactId>
@@ -96,7 +96,7 @@ limitations under the License.
                                <version>2.8</version>
                        </plugin>
                        <plugin>
-                               <!-- explicitly define maven-deploy-plugin after other to force exec 
+                               <!-- explicitly define maven-deploy-plugin after other to force exec
                                        order -->
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-deploy-plugin</artifactId>
@@ -133,7 +133,7 @@ limitations under the License.
                <dependency>
                        <groupId>com.att.eelf</groupId>
                        <artifactId>eelf-core</artifactId>
-                       <exclusions><!-- excluding transitive dependency coming from this artifact, 
+                       <exclusions><!-- excluding transitive dependency coming from this artifact,
                                        as we would need powermock-api-mockito2 -->
                                <exclusion>
                                        <groupId>org.powermock</groupId>
index 4ece377..c383f0c 100644 (file)
 
 package org.onap.aai.introspection.sideeffect;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
-
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Optional;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
-import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.introspection.Introspector;
 import org.onap.aai.schema.enums.PropertyMetadata;
 import org.onap.aai.serialization.db.DBSerializer;
 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Map.Entry;
+import java.util.Optional;
 
 public class OwnerCheck extends SideEffect {
 
+    public static final String READ_ONLY_SUFFIX = "_readOnly";
+    private static final String DATA_OWNER = "data-owner";
+
     public OwnerCheck(Introspector obj, Vertex self, TransactionalGraphEngine dbEngine, DBSerializer serializer) {
         super(obj, self, dbEngine, serializer);
     }
@@ -55,21 +54,15 @@ public class OwnerCheck extends SideEffect {
     }
 
     public static boolean isAuthorized(java.util.Set<String> groups, Vertex vertex) {
-        if (groups != null && !groups.isEmpty()) {
-            List<Vertex> owningEntity = vertex.graph().traversal()
-                .V(vertex)
-                .bothE("org.onap.relationships.inventory.BelongsTo")
-                .otherV()
-                .has("aai-node-type", "owning-entity")
-                .toList();
-
-            if(!owningEntity.isEmpty()) {
-                VertexProperty owningEntityName = owningEntity.get(0).property("owning-entity-name");
-
-                return groups.contains(owningEntityName.orElseGet(null));
+        if (!CollectionUtils.isEmpty(groups)) {
+            Object dataOwnerProperty = vertex.property(DATA_OWNER).orElse(null);
+            if (ObjectUtils.isNotEmpty(dataOwnerProperty)) {
+                String dataOwner = dataOwnerProperty.toString();
+                String dataOwnerWithReadAccess = dataOwner + READ_ONLY_SUFFIX;
+                return groups.stream()
+                    .anyMatch(group -> group.equals(dataOwner) || group.equals(dataOwnerWithReadAccess));
             }
         }
-
         return true;
     }
 
index 14621e8..7ab49a1 100644 (file)
@@ -115,6 +115,7 @@ public class DBSerializer {
     private Map<String, Pair<Introspector, LinkedHashMap<String, Introspector>>> impliedDeleteUriObjectPair = new LinkedHashMap<>();
     private int notificationDepth;
     private boolean isDeltaEventsEnabled;
+    private boolean isMultiTenancyEnabled;
 
     /**
      * Instantiates a new DB serializer.
@@ -271,6 +272,7 @@ public class DBSerializer {
         EdgeSerializer es = ctx.getBean(EdgeSerializer.class);
         setEdgeSerializer(es);
         isDeltaEventsEnabled = Boolean.parseBoolean(SpringContextAware.getApplicationContext().getEnvironment().getProperty("delta.events.enabled", FALSE));
+        isMultiTenancyEnabled = Boolean.parseBoolean(SpringContextAware.getApplicationContext().getEnvironment().getProperty("multi.tenancy.enabled", FALSE));
     }
 
     public void setEdgeSerializer(EdgeSerializer edgeSer) {
@@ -2270,10 +2272,12 @@ public class DBSerializer {
 
     private void executePreSideEffects(Introspector obj, Vertex self) throws AAIException {
 
-        SideEffectRunner runner = new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataCopy.class)
-                .addSideEffect(PrivateEdge.class).addSideEffect(OwnerCheck.class).build();
-
-        runner.execute(obj, self);
+        SideEffectRunner.Builder runnerBuilder =
+            new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataCopy.class).addSideEffect(PrivateEdge.class);
+        if (isMultiTenancyEnabled) {
+            runnerBuilder.addSideEffect(OwnerCheck.class);
+        }
+        runnerBuilder.build().execute(obj, self);
     }
 
     private void executePostSideEffects(Introspector obj, Vertex self) throws AAIException {
@@ -2286,11 +2290,13 @@ public class DBSerializer {
 
     private void enrichData(Introspector obj, Vertex self) throws AAIException {
 
-        SideEffectRunner runner =
-                new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataLinkReader.class)
-                    .addSideEffect(OwnerCheck.class).build();
+        SideEffectRunner.Builder runnerBuilder =
+            new SideEffectRunner.Builder(this.engine, this).addSideEffect(DataLinkReader.class);
 
-        runner.execute(obj, self);
+        if (isMultiTenancyEnabled) {
+            runnerBuilder.addSideEffect(OwnerCheck.class);
+        }
+        runnerBuilder.build().execute(obj, self);
     }
 
     public double getDBTimeMsecs() {
index 0e33f6c..9f10196 100644 (file)
@@ -86,16 +86,10 @@ public class OwnerCheckTest extends AAISetup {
             .addV("pnf")
             .property("aai-node-type", "pnf")
             .property("pnf-name", "my-pnf")
+            .property("data-owner", "Operator")
             .property(AAIProperties.AAI_URI, "/network/pnfs/pnf/my-pnf")
             .property("model-invariant-id", "key1")
             .as("v1")
-            .addV("owning-entity")
-            .property("aai-node-type", "owning-entity")
-            .property("owning-entity-name", "OE-Generic")
-            .property("owning-entity-id", "367c897c-8cec-47ba-b7f5-4b6139f06691")
-            .property(AAIProperties.AAI_URI,"/network/pnfs/pnf/my-pnf/business/owning-entities/owning-entity/367c897c-8cec-47ba-b7f5-4b6139f06691")
-            .as("oe")
-            .addE("org.onap.relationships.inventory.BelongsTo").to("v1").from("oe")
             .property(EdgeProperty.CONTAINS.toString(), true)
             .addV("model-ver")
             .property("aai-node-type", "model-ver")
@@ -137,14 +131,13 @@ public class OwnerCheckTest extends AAISetup {
     }
 
     @Test
-    public void shouldFailComparisonWithDiffOwningEntity() throws Exception  {
+    public void shouldFailIfGroupsNotContainsDataOwner() throws Exception  {
 
         final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
         final Introspector obj = loader.introspectorFromName("pnf");
         obj.setValue("pnf-name", "my-pnf");
         obj.setValue("model-invariant-id", "key1");
         obj.setValue("model-version-id", "key2");
-        //obj.setValue("owning-entity-id", "367c897c-8cec-47ba-b7f5-4b6139f06691");
         TransactionalGraphEngine spy = spy(dbEngine);
         TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
         Graph g = graph.newTransaction();
@@ -152,30 +145,29 @@ public class OwnerCheckTest extends AAISetup {
         when(spy.asAdmin()).thenReturn(adminSpy);
         when(adminSpy.getTraversalSource()).thenReturn(traversal);
         DBSerializer serializer =
-                new DBSerializer(schemaVersions.getDefaultVersion(),
-                    spy, introspectorFactoryType,
-                    "AAI_TEST", new HashSet<>(Arrays.asList("OE-GenericI", "OE-GenericII")));
+            new DBSerializer(schemaVersions.getDefaultVersion(),
+                spy, introspectorFactoryType,
+                "AAI_TEST", new HashSet<>(Arrays.asList("OperatorI", "OperatorII")));
 
         Vertex selfV = g.traversal().V().has("aai-node-type", "pnf").next();
 
         OwnerCheck ownerCheck = new OwnerCheck(obj, selfV, spy, serializer);
 
         thrown.expect(AAIException.class);
-        thrown.expectMessage("Group(s) :[OE-GenericI, OE-GenericII] not authorized to perform function");
+        thrown.expectMessage("Group(s) :[OperatorII, OperatorI] not authorized to perform function");
         ownerCheck.execute();
         g.tx().rollback();
 
     }
 
     @Test
-    public void shouldPassIfOwningEntityEqual() throws Exception  {
+    public void shouldPassIfGroupsContainsDataOwner() throws Exception  {
 
         final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
         final Introspector obj = loader.introspectorFromName("pnf");
         obj.setValue("pnf-name", "my-pnf");
         obj.setValue("model-invariant-id", "key1");
         obj.setValue("model-version-id", "key2");
-        //obj.setValue("owning-entity-id", "367c897c-8cec-47ba-b7f5-4b6139f06691");
         TransactionalGraphEngine spy = spy(dbEngine);
         TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
         Graph g = graph.newTransaction();
@@ -189,25 +181,78 @@ public class OwnerCheckTest extends AAISetup {
         DBSerializer serializer =
             new DBSerializer(schemaVersions.getDefaultVersion(),
                 spy, introspectorFactoryType,
-                "AAI_TEST", new HashSet<>(Arrays.asList("OE-Generic", "OE-GenericII")));
+                "AAI_TEST", new HashSet<>(Arrays.asList("OperatorIII", "Operator")));
+
+        OwnerCheck ownerCheck = new OwnerCheck(obj, selfV, spy, serializer);
+
+        ownerCheck.execute();
+        g.tx().rollback();
+    }
+
+    @Test
+    public void shouldPassIfGroupsIsEmpty() throws Exception  {
+
+        final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
+        final Introspector obj = loader.introspectorFromName("pnf");
+        obj.setValue("pnf-name", "my-pnf");
+        obj.setValue("model-invariant-id", "key1");
+        obj.setValue("model-version-id", "key2");
+        TransactionalGraphEngine spy = spy(dbEngine);
+        TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+        Graph g = graph.newTransaction();
+        GraphTraversalSource traversal = g.traversal();
+        when(spy.asAdmin()).thenReturn(adminSpy);
+        when(adminSpy.getTraversalSource()).thenReturn(traversal);
+        DBSerializer serializer =
+            new DBSerializer(schemaVersions.getDefaultVersion(),
+                spy, introspectorFactoryType,
+                "AAI_TEST");
+
+        Vertex selfV = g.traversal().V().has("aai-node-type", "pnf").next();
 
         OwnerCheck ownerCheck = new OwnerCheck(obj, selfV, spy, serializer);
 
         ownerCheck.execute();
+        g.tx().rollback();
+    }
+
+    @Test
+    public void shouldPassIfDataOwnerIsNull() throws Exception  {
+
+        final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
+        final Introspector obj = loader.introspectorFromName("pnf");
+        obj.setValue("pnf-name", "my-pnf");
+        obj.setValue("model-invariant-id", "key1");
+        obj.setValue("model-version-id", "key2");
+        obj.setValue("data-owner", null);
+        TransactionalGraphEngine spy = spy(dbEngine);
+        TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+        Graph g = graph.newTransaction();
+        GraphTraversalSource traversal = g.traversal();
+        when(spy.asAdmin()).thenReturn(adminSpy);
+        when(adminSpy.getTraversalSource()).thenReturn(traversal);
+        DBSerializer serializer =
+            new DBSerializer(schemaVersions.getDefaultVersion(),
+                spy, introspectorFactoryType,
+                "AAI_TEST");
+
+        Vertex selfV = g.traversal().V().has("aai-node-type", "pnf").next();
 
+        OwnerCheck ownerCheck = new OwnerCheck(obj, selfV, spy, serializer);
 
+        ownerCheck.execute();
         g.tx().rollback();
     }
 
     @Test
-    public void shouldPassIfUserOwningEntityEmptyl() throws Exception  {
+    public void shouldPassIfDataOwnerIsEmpty() throws Exception  {
 
         final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion());
         final Introspector obj = loader.introspectorFromName("pnf");
         obj.setValue("pnf-name", "my-pnf");
         obj.setValue("model-invariant-id", "key1");
         obj.setValue("model-version-id", "key2");
-        //obj.setValue("owning-entity-id", "367c897c-8cec-47ba-b7f5-4b6139f06691");
+        obj.setValue("data-owner", "");
         TransactionalGraphEngine spy = spy(dbEngine);
         TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
         Graph g = graph.newTransaction();
index b08e4fb..99596cd 100644 (file)
             <xml-property name="ownerCheck" value="N/A"/>
           </xml-properties>
         </xml-element>
+        <xml-element java-attribute="dataOwner" name="data-owner" type="java.lang.String">
+            <xml-properties>
+                <xml-property name="description" value="Resource owner"/>
+            </xml-properties>
+        </xml-element>
         <xml-element java-attribute="pnfName2" name="pnf-name2" type="java.lang.String">
           <xml-properties>
             <xml-property name="description" value="name of Physical Network Function."/>
index 6924144..e9156e4 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-els-onap-logging</artifactId>
index dc12e46..4465a10 100644 (file)
@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -31,6 +31,6 @@
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjrt</artifactId>
             <version>1.9.1</version>
-        </dependency>                  
+        </dependency>
     </dependencies>
 </project>
index dd4795e..b1135b7 100644 (file)
@@ -27,7 +27,7 @@ limitations under the License.
   <parent>
     <groupId>org.onap.aai.aai-common</groupId>
     <artifactId>aai-common</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.1-SNAPSHOT</version>
   </parent>
   <artifactId>aai-parent</artifactId>
   <name>aai-parent</name>
index b03a752..ece1e2d 100644 (file)
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-rest</artifactId>
index a9cb047..f55d68b 100644 (file)
@@ -28,7 +28,7 @@
   <parent>
     <groupId>org.onap.aai.aai-common</groupId>
     <artifactId>aai-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.1-SNAPSHOT</version>
     <relativePath>../aai-parent/pom.xml</relativePath>
   </parent>
 
index 6772173..8e93c1b 100644 (file)
@@ -26,7 +26,7 @@ limitations under the License.
        <parent>
                <groupId>org.onap.aai.aai-common</groupId>
                <artifactId>aai-parent</artifactId>
-               <version>1.8.0-SNAPSHOT</version>
+               <version>1.8.1-SNAPSHOT</version>
                <relativePath>../aai-parent/pom.xml</relativePath>
        </parent>
        <artifactId>aai-schema-ingest</artifactId>
index 5107fb7..cb8b184 100644 (file)
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.onap.aai.aai-common</groupId>
         <artifactId>aai-parent</artifactId>
-        <version>1.8.0-SNAPSHOT</version>
+        <version>1.8.1-SNAPSHOT</version>
         <relativePath>../aai-parent/pom.xml</relativePath>
     </parent>
     <artifactId>aai-utils</artifactId>
diff --git a/pom.xml b/pom.xml
index c9d76b2..6db20e1 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
 
     <groupId>org.onap.aai.aai-common</groupId>
     <artifactId>aai-common</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.1-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>aai-aai-common</name>
     <description>Contains all of the common code for resources and traversal repos</description>
index 5403b8c..b40cc93 100644 (file)
@@ -5,7 +5,7 @@
 
 major_version=1
 minor_version=8
-patch_version=0
+patch_version=1
 
 base_version=${major_version}.${minor_version}.${patch_version}