Support --bulk in --set-policy in Cyad 81/32181/6
authorAleksander Zdyb <a.zdyb@samsung.com>
Fri, 12 Dec 2014 13:25:08 +0000 (14:25 +0100)
committerPawel Wieczorek <p.wieczorek2@samsung.com>
Mon, 29 Dec 2014 14:45:39 +0000 (15:45 +0100)
Change-Id: I3c6792fc1f5da1d5ce8c7ca5cca2bc7380154902

src/cyad/CommandlineParser/CyadCommand.cpp
src/cyad/CommandlineParser/CyadCommand.h
src/cyad/CommandsDispatcher.cpp
src/cyad/CommandsDispatcher.h
test/cyad/commands_dispatcher.cpp

index 8ab6934..0e482fa 100644 (file)
@@ -50,4 +50,8 @@ int SetPolicyCyadCommand::run(CommandsDispatcher &dispatcher) {
     return dispatcher.execute(*this);
 }
 
+int SetPolicyBulkCyadCommand::run(CommandsDispatcher &dispatcher) {
+    return dispatcher.execute(*this);
+}
+
 } /* namespace Cynara */
index 2870582..fc2c808 100644 (file)
@@ -137,6 +137,22 @@ private:
     PolicyKey m_policyKey;
 };
 
+class SetPolicyBulkCyadCommand : public CyadCommand {
+public:
+    SetPolicyBulkCyadCommand(const std::string &filename) : m_filename(filename) {}
+
+    virtual ~SetPolicyBulkCyadCommand() {}
+
+    virtual int run(CommandsDispatcher &dispatcher);
+
+    const std::string &filename(void) const {
+        return m_filename;
+    }
+
+private:
+    std::string m_filename;
+};
+
 } /* namespace Cynara */
 
 #endif /* SRC_CYAD_COMMANDLINEPARSER_CYADCOMMAND_H_ */
index 436e144..203aab2 100644 (file)
 #include <cynara-error.h>
 #include <cynara-policy-types.h>
 
+#include <exceptions/BucketRecordCorruptedException.h>
+
 #include <cyad/AdminLibraryInitializationFailedException.h>
 #include <cyad/CynaraAdminPolicies.h>
+#include <cyad/AdminPolicyParser.h>
 
 #include "CommandsDispatcher.h"
 
@@ -83,4 +86,16 @@ int CommandsDispatcher::execute(SetPolicyCyadCommand &result) {
     return m_adminApiWrapper.cynara_admin_set_policies(m_cynaraAdmin, policies.data());
 }
 
+int CommandsDispatcher::execute(SetPolicyBulkCyadCommand &result) {
+    auto input = m_io.openFile(result.filename());
+
+    try {
+        auto policies = Cynara::AdminPolicyParser::parse(input);
+        return m_adminApiWrapper.cynara_admin_set_policies(m_cynaraAdmin, policies.data());
+    } catch (const BucketRecordCorruptedException &ex) {
+        m_io.cerr() << ex.message();
+        return CYNARA_API_INVALID_COMMANDLINE_PARAM;
+    }
+}
+
 } /* namespace Cynara */
index 63d2441..4193a95 100644 (file)
@@ -43,6 +43,7 @@ public:
     virtual int execute(DeleteBucketCyadCommand &);
     virtual int execute(SetBucketCyadCommand &);
     virtual int execute(SetPolicyCyadCommand &);
+    virtual int execute(SetPolicyBulkCyadCommand &);
 
 private:
     // TODO: Get argv[0] instead of hardcoded name
@@ -61,6 +62,7 @@ private:
                                     "  -r, --privilege=<privilege>    privilege value\n"
                                     "  -p, --policy=<policy>          policy\n"
                                     "  -m, --metadata=<metadata>      metadata for policy\n"
+                                    "  -f, --bulk=<filename>          path or - for stdin\n"
                                     "\n"
                                     "Help options:\n"
                                     "  -h, --help                     print help message";
index d459dad..34ff9dc 100644 (file)
@@ -20,6 +20,7 @@
  * @brief       Tests for CommandsDispatcher
  */
 
+#include <ostream>
 #include <tuple>
 #include <vector>
 
@@ -181,3 +182,50 @@ TEST_F(CyadCommandlineDispatcherTest, setPolicyWithMetadata) {
 
     dispatcher.execute(result);
 }
+
+TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulk) {
+    using ::testing::_;
+    using ::testing::Return;
+
+    FakeAdminApiWrapper adminApi;
+
+    EXPECT_CALL(adminApi, cynara_admin_initialize(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+    EXPECT_CALL(adminApi, cynara_admin_finish(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+
+    Cynara::CommandsDispatcher dispatcher(m_io, adminApi);
+    Cynara::SetPolicyBulkCyadCommand result("-");
+
+    // fake stdin ;)
+    m_io.file() << "bucket;cli;usr;privilege;0;metadata" << std::endl;
+    m_io.file() << "bucket-2;cli;usr;privilege;0xFFFF";
+
+    Cynara::CynaraAdminPolicies expectedPolicies;
+    expectedPolicies.add("bucket", { CYNARA_ADMIN_DENY, "metadata" }, {"cli", "usr", "privilege"} );
+    expectedPolicies.add("bucket-2", { CYNARA_ADMIN_ALLOW, "" }, {"cli", "usr", "privilege"} );
+    expectedPolicies.seal();
+
+    EXPECT_CALL(adminApi, cynara_admin_set_policies(_, AdmPolicyListEq(expectedPolicies.data())))
+        .WillOnce(Return(CYNARA_API_SUCCESS));
+
+    dispatcher.execute(result);
+}
+
+TEST_F(CyadCommandlineDispatcherTest, setPoliciesBulkInputError) {
+    using ::testing::_;
+    using ::testing::Return;
+
+    FakeAdminApiWrapper adminApi;
+
+    EXPECT_CALL(adminApi, cynara_admin_initialize(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+    EXPECT_CALL(adminApi, cynara_admin_finish(_)).WillOnce(Return(CYNARA_API_SUCCESS));
+
+    Cynara::CommandsDispatcher dispatcher(m_io, adminApi);
+    Cynara::SetPolicyBulkCyadCommand result("-");
+
+    // fake stdin ;)
+    m_io.file() << "invalid input" << std::endl;
+
+    dispatcher.execute(result);
+
+    ASSERT_FALSE(m_io.cerrRaw().str().empty());
+}