rhtyd commented on a change in pull request #4071:
URL: https://github.com/apache/cloudstack/pull/4071#discussion_r439285700



##########
File path: 
engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java
##########
@@ -235,6 +238,267 @@ private void updateSystemVmTemplates(final Connection 
conn) {
         LOG.debug("Updating System Vm Template IDs Complete");
     }
 
+    private void addRolePermissionsForNewReadOnlyAndSupportRoles(final 
Connection conn) {
+        addRolePermissionsForReadOnlyAdmin(conn);
+        addRolePermissionsForReadOnlyUser(conn);
+        addRolePermissionsForAdminSupport(conn);
+        addRolePermissionsForUserSupport(conn);
+    }
+
+    private void addRolePermissionsForReadOnlyAdmin(final Connection conn) {
+        LOG.debug("Adding role permissions for new read-only admin role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM 
`cloud`.`roles` WHERE name = 'Read-Only Admin (Default)' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long readOnlyAdminRoleId = rs.getLong(1);
+                int readOnlyAdminSortOrder = 0;
+                List<String> insertSqlForReadOnlyAdminRolePermissions = new 
ArrayList<String>();
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'list*', 'ALLOW', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'getUploadParamsFor*', 'DENY', ?) ON DUPLICATE 
KEY UPDATE rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'get*', 'ALLOW', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'cloudianIsEnabled', 'ALLOW', ?) ON DUPLICATE 
KEY UPDATE rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaIsEnabled', 'ALLOW', ?) ON DUPLICATE KEY 
UPDATE rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaTariffList', 'ALLOW', ?) ON DUPLICATE 
KEY UPDATE rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaSummary', 'ALLOW', ?) ON DUPLICATE KEY 
UPDATE rule=rule");
+                insertSqlForReadOnlyAdminRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, '*', 'DENY', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+
+                for(String insertSqlForReadOnlyAdmin : 
insertSqlForReadOnlyAdminRolePermissions) {
+                    pstmt = conn.prepareStatement(insertSqlForReadOnlyAdmin);
+                    pstmt.setLong(1, readOnlyAdminRoleId);
+                    pstmt.setLong(2, readOnlyAdminSortOrder++);
+                    pstmt.executeUpdate();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new read-only 
admin role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for read-only 
admin role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role 
permissions for read-only admin role: " + e.getMessage(), e);
+        }
+    }
+
+    private void addRolePermissionsForReadOnlyUser(final Connection conn) {
+        LOG.debug("Adding role permissions for new read-only user role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM 
`cloud`.`roles` WHERE name = 'Read-Only User (Default)' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long readOnlyUserRoleId = rs.getLong(1);
+                int readOnlyUserSortOrder = 0;
+
+                pstmt = conn.prepareStatement("SELECT rule FROM 
`cloud`.`role_permissions` WHERE role_id = 4 AND permission = 'ALLOW' AND rule 
LIKE 'list%' ORDER BY sort_order");
+                ResultSet rsRolePermissions = pstmt.executeQuery();
+
+                while (rsRolePermissions.next()) {
+                    String rule = rsRolePermissions.getString(1);
+                    pstmt = conn.prepareStatement("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setString(2, rule);
+                    pstmt.setLong(3, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                pstmt = conn.prepareStatement("SELECT rule FROM 
`cloud`.`role_permissions` WHERE role_id = 4 AND permission = 'ALLOW' AND rule 
LIKE 'get%' AND rule NOT LIKE 'getUploadParamsFor%' ORDER BY sort_order");
+                rsRolePermissions = pstmt.executeQuery();
+
+                while (rsRolePermissions.next()) {
+                    String rule = rsRolePermissions.getString(1);
+                    pstmt = conn.prepareStatement("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setString(2, rule);
+                    pstmt.setLong(3, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                List<String> insertSqlForReadOnlyUserRolePermissions = new 
ArrayList<String>();
+                insertSqlForReadOnlyUserRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'cloudianIsEnabled', 'ALLOW', ?) ON DUPLICATE 
KEY UPDATE rule=rule");
+                insertSqlForReadOnlyUserRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaIsEnabled', 'ALLOW', ?) ON DUPLICATE KEY 
UPDATE rule=rule");
+                insertSqlForReadOnlyUserRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaTariffList', 'ALLOW', ?) ON DUPLICATE 
KEY UPDATE rule=rule");
+                insertSqlForReadOnlyUserRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'quotaSummary', 'ALLOW', ?) ON DUPLICATE KEY 
UPDATE rule=rule");
+                insertSqlForReadOnlyUserRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, '*', 'DENY', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+
+                for(String insertSqlForReadOnlyUser : 
insertSqlForReadOnlyUserRolePermissions) {
+                    pstmt = conn.prepareStatement(insertSqlForReadOnlyUser);
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setLong(2, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                if (rsRolePermissions != null && 
!rsRolePermissions.isClosed())  {
+                    rsRolePermissions.close();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new read-only 
user role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for read-only 
user role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role 
permissions for read-only user role: " + e.getMessage(), e);
+        }
+    }
+
+    private void addRolePermissionsForAdminSupport(final Connection conn) {
+        LOG.debug("Adding role permissions for new admin support role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM 
`cloud`.`roles` WHERE name = 'Admin-Support (Default)' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long adminSupportRoleId = rs.getLong(1);
+                int adminSupportSortOrder = 0;
+
+                pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` 
WHERE name = 'Read-Only Admin (Default)' AND is_default = 1");
+                ResultSet rsReadOnlyAdmin = pstmt.executeQuery();
+                if (rsReadOnlyAdmin.next()) {
+                    long readOnlyAdminRoleId = rsReadOnlyAdmin.getLong(1);
+                    pstmt = conn.prepareStatement("SELECT rule FROM 
`cloud`.`role_permissions` WHERE role_id = ? AND permission = 'ALLOW' ORDER BY 
sort_order");
+                    pstmt.setLong(1, readOnlyAdminRoleId);
+                    ResultSet rsRolePermissions = pstmt.executeQuery();
+
+                    while (rsRolePermissions.next()) {
+                        String rule = rsRolePermissions.getString(1);
+                        pstmt = conn.prepareStatement("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE 
rule=rule");
+                        pstmt.setLong(1, adminSupportRoleId);
+                        pstmt.setString(2, rule);
+                        pstmt.setLong(3, adminSupportSortOrder++);
+                        pstmt.executeUpdate();
+                    }
+
+                    List<String> insertSqlForAdminSupportRolePermissions = new 
ArrayList<String>();
+                    insertSqlForAdminSupportRolePermissions.add("INSERT INTO 
`cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, 
`sort_order`) VALUES (UUID(), ?, 'prepareHostForMaintenance', 'ALLOW', ?) ON 
DUPLICATE KEY UPDATE rule=rule");

Review comment:
       nit - Could be made less verbose by doing a loop on the API strings and 
add the string to the collection/list. Same for other parts of code.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to