Respond to AdminCheckRequest with AdminCheckResponse 68/31568/7
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Fri, 5 Dec 2014 23:37:20 +0000 (00:37 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 15 Dec 2014 14:38:18 +0000 (15:38 +0100)
Change implementation of both service and admin library Logic layers
so they use AdminCheckResponse instead of CheckResponse as a reply
for AdminCheckRequest.

This change allows passing additional information about existence
or vacancy of start bucket given in AdminCheckRequest.
In case of vacancy of such bucket in cynara database cynara-admin
library returns CYNARA_API_BUCKET_NOT_FOUND from cynara_admin_check()
function.

This fixes also a bug that was hidden in service Logic. Passing
unexisting bucket causes cynara service to stop because of an unhandled
exception.

Change-Id: Ibf65a69c35ba92ea62bee91a67f43975b97052ca

src/admin/logic/Logic.cpp
src/common/protocol/ProtocolAdmin.cpp
src/common/protocol/ProtocolAdmin.h
src/service/logic/Logic.cpp

index 6648189..7fef282 100644 (file)
@@ -37,7 +37,7 @@
 #include <request/pointers.h>
 #include <request/RemoveBucketRequest.h>
 #include <request/SetPoliciesRequest.h>
-#include <response/CheckResponse.h>
+#include <response/AdminCheckResponse.h>
 #include <response/CodeResponse.h>
 #include <response/ListResponse.h>
 #include <response/pointers.h>
@@ -132,7 +132,7 @@ int Logic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const P
     ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
 
     //Ask cynara service
-    CheckResponsePtr checkResponse;
+    AdminCheckResponsePtr adminCheckResponse;
 
     RequestPtr request = std::make_shared<AdminCheckRequest>(key, startBucket, recursive,
                                                              sequenceNumber);
@@ -142,17 +142,23 @@ int Logic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const P
             return CYNARA_API_SERVICE_NOT_AVAILABLE;
     }
 
-    checkResponse = std::dynamic_pointer_cast<CheckResponse>(response);
-    if (!checkResponse) {
-        LOGC("Casting Response to CheckResponse failed.");
+    adminCheckResponse = std::dynamic_pointer_cast<AdminCheckResponse>(response);
+    if (!adminCheckResponse) {
+        LOGC("Casting Response to AdminCheckResponse failed.");
         return CYNARA_API_UNKNOWN_ERROR;
     }
 
-    LOGD("checkResponse: policyType [%" PRIu16 "], metadata <%s>",
-         checkResponse->m_resultRef.policyType(),
-         checkResponse->m_resultRef.metadata().c_str());
+    LOGD("AdminCheckResponse: policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d]",
+         adminCheckResponse->result().policyType(), adminCheckResponse->result().metadata().c_str(),
+         static_cast<int>(adminCheckResponse->isBucketValid()));
 
-    result = checkResponse->m_resultRef;
+    if (!adminCheckResponse->isBucketValid()) {
+        LOGE("Bucket <%s> provided as startBucket in adminCheck does not exist in cynara database",
+             startBucket.c_str());
+        return CYNARA_API_BUCKET_NOT_FOUND;
+    }
+
+    result = adminCheckResponse->result();
     return CYNARA_API_SUCCESS;
 }
 
index 2c1164e..293db97 100644 (file)
@@ -35,7 +35,6 @@
 #include <request/RequestContext.h>
 #include <request/SetPoliciesRequest.h>
 #include <response/AdminCheckResponse.h>
-#include <response/CheckResponse.h>
 #include <response/CodeResponse.h>
 #include <response/ListResponse.h>
 #include <types/PolicyKey.h>
@@ -216,21 +215,6 @@ ResponsePtr ProtocolAdmin::deserializeAdminCheckResponse(void) {
                                                 m_frameHeader.sequenceNumber());
 }
 
-ResponsePtr ProtocolAdmin::deserializeCheckResponse(void) {
-    PolicyType result;
-    PolicyResult::PolicyMetadata additionalInfo;
-
-    ProtocolDeserialization::deserialize(m_frameHeader, result);
-    ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
-
-    const PolicyResult policyResult(result, additionalInfo);
-
-    LOGD("Deserialized CheckResponse: result [%" PRIu16 "], metadata <%s>",
-         policyResult.policyType(), policyResult.metadata().c_str());
-
-    return std::make_shared<CheckResponse>(policyResult, m_frameHeader.sequenceNumber());
-}
-
 ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
     ProtocolResponseCode responseCode;
     ProtocolDeserialization::deserialize(m_frameHeader, responseCode);
@@ -285,8 +269,6 @@ ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue)
         switch (opCode) {
         case OpAdminCheckPolicyResponse:
             return deserializeAdminCheckResponse();
-        case OpCheckPolicyResponse:
-            return deserializeCheckResponse();
         case OpCodeResponse:
             return deserializeCodeResponse();
         case OpListResponse:
@@ -424,22 +406,6 @@ void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckResponsePtr res
     ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
 }
 
-void ProtocolAdmin::execute(RequestContextPtr context, CheckResponsePtr response) {
-    LOGD("Serializing CheckResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
-         "policyType [%" PRIu16 "], metadata <%s>", OpCheckPolicyResponse,
-         response->sequenceNumber(), response->m_resultRef.policyType(),
-         response->m_resultRef.metadata().c_str());
-
-    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
-            response->sequenceNumber());
-
-    ProtocolSerialization::serialize(frame, OpCheckPolicyResponse);
-    ProtocolSerialization::serialize(frame, response->m_resultRef.policyType());
-    ProtocolSerialization::serialize(frame, response->m_resultRef.metadata());
-
-    ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
-}
-
 void ProtocolAdmin::execute(RequestContextPtr context, CodeResponsePtr response) {
     LOGD("Serializing CodeResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
          "code [%" PRIu16 "]", OpCodeResponse, response->sequenceNumber(), response->m_code);
index 1454be2..b9c7e17 100644 (file)
@@ -45,7 +45,6 @@ public:
     virtual void execute(RequestContextPtr context, SetPoliciesRequestPtr request);
 
     virtual void execute(RequestContextPtr context, AdminCheckResponsePtr response);
-    virtual void execute(RequestContextPtr context, CheckResponsePtr response);
     virtual void execute(RequestContextPtr context, CodeResponsePtr response);
     virtual void execute(RequestContextPtr context, ListResponsePtr response);
 
@@ -57,7 +56,6 @@ private:
     RequestPtr deserializeSetPoliciesRequest(void);
 
     ResponsePtr deserializeAdminCheckResponse(void);
-    ResponsePtr deserializeCheckResponse(void);
     ResponsePtr deserializeCodeResponse(void);
     ResponsePtr deserializeListResponse(void);
 };
index 679da17..3445984 100644 (file)
@@ -48,6 +48,7 @@
 #include <request/RequestContext.h>
 #include <request/SetPoliciesRequest.h>
 #include <request/SignalRequest.h>
+#include <response/AdminCheckResponse.h>
 #include <response/AgentRegisterResponse.h>
 #include <response/CancelResponse.h>
 #include <response/CheckResponse.h>
@@ -86,10 +87,16 @@ void Logic::execute(RequestContextPtr context UNUSED, SignalRequestPtr request)
 }
 
 void Logic::execute(RequestContextPtr context, AdminCheckRequestPtr request) {
-    PolicyResult result = m_storage->checkPolicy(request->key(), request->startBucket(),
-                                                 request->recursive());
+    PolicyResult result;
+    bool bucketValid = true;
+    try {
+        result = m_storage->checkPolicy(request->key(), request->startBucket(),
+                                        request->recursive());
+    } catch (const BucketNotExistsException &ex) {
+        bucketValid = false;
+    }
 
-    context->returnResponse(context, std::make_shared<CheckResponse>(result,
+    context->returnResponse(context, std::make_shared<AdminCheckResponse>(result, bucketValid,
                             request->sequenceNumber()));
 }